我们利用Map存数,遍历输出的时候希望其按照put的顺序,顺序输出,如何实现呢?其实非常简单,我们常常实现Map的时候,都是采用HashMap,很容易忽略其链表形式的LinkedHashMap(),今天犯了一个容易忽视的错误,先看代码:

public static void main(String[] args) {
		Map<String, String> hashMap = new HashMap<String, String>();
		hashMap.put("1", "aaa");
		hashMap.put("2", "bbb");
		hashMap.put("3", "ccc");
		hashMap.put("4", "ddd");
		hashMap.put("5", "eee");

		for(int i = 0;i<100;){
			for (Map.Entry<String, String> entry : hashMap.entrySet()) {
				System.out.println("hashKey= " + entry.getKey() + "\t" + "hashValue = " + entry.getValue());
			}
			i++;
			System.out.println("\r\n");
		}
	}

代码非常简单,但是遍历100次输出,结果竟然真的是顺序输出,当时我就纳闷了?HashMap不是无序的吗?

改了改代码:

public static void main(String[] args) {
		Map<String, String> hashMap = new HashMap<String, String>();
		Map<String, String> linkedHashMap = new LinkedHashMap<String, String>();

		hashMap.put("1", "aaa");
		hashMap.put("22", "bbb");
		hashMap.put("333", "ccc");
		hashMap.put("4444", "ddd");
		hashMap.put("55555", "eee");

		linkedHashMap.put("6", "老胡");
		linkedHashMap.put("77", "小张");
		linkedHashMap.put("888", "红中");
		linkedHashMap.put("9999", "东风");
		linkedHashMap.put("10000", "西");

		for (Map.Entry<String, String> entry : hashMap.entrySet()) {
			System.out.println("hashKey= " + entry.getKey() + "\t" + "hashValue = " + entry.getValue());
		}

		for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {
			System.err.println("linkKey= " + entry.getKey() + "\t" + "linkValue = " + entry.getValue());
		}

	}

结果输出果真变成无序的了,想要按照put顺序输出,我们可以采用LinkedHashMap(),它内部有一个链表,保持插入的顺序。迭代的时候,也是按照插入顺序迭代,而且迭代比HashMap快。

结果今天一下子没想到,差点还去写按照key排序的方法,汗颜!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐