- HashMap 是无序的,HashMap 在put的时候是根据key的hashcode进行hash然后放入对应的地方。所以在按照一定顺序put进HashMap中,然后遍历HashMap的顺序跟put的顺序不同(除非在put时已经能确定key的hashcode值并按其排序)。
- LinkedHashMap 是非线程安全的。
- LinkedHashMap 是 HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序与插入的顺序一致,那么选用LinkedHashMap。
- LinkedHashMap 是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序。特别是它不保证该顺序永恒不变。
- LinkedHashMap 与 HashMap 的不同之处在于,LinkedHashMap 维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者访问顺序。
示例:HashMap
public static void main(String[] args){
Map<String,String> map = new HashedMap();
map.put("A","a");
map.put("B","b");
map.put("C","c");
map.put("D","d");
Set<String> set = map.keySet();
for (String s : set){
System.out.println(s + "_" + map.get(s));
}
}
输出:
D_d
A_a
C_c
B_b
示例:LinkedHashMap
public static void main(String[] args){
Map<String,String> map = new LinkedHashMap();
map.put("A","a");
map.put("B","b");
map.put("C","c");
map.put("D","d");
Set<String> set = map.keySet();
for (String s : set){
System.out.println(s + "_" + map.get(s));
}
}
输出:
A_a
B_b
C_c
D_d
- LinkedHashMap:并且初始化LinkedHashMap,使用get可以按照访问顺序进行输出,观察输出结果我们会发现get()到的对象会放在后面,具体原因是因为采用了LRU(Least recently used)算法(太高深了,请自行搜索吧)。
- LRU(Least recently used):最近最少使用,也就是说当缓存满了,会优先淘汰那些最近不常访问的数据。 new LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder) initialCapacity:初始容量 loadFactor:负载系数 accessOrder:是否使用LRU算法: false——所有的Entry按照插入的顺序排序, true——所有的Entry按照访问的顺序排序 |——如果有a,b,c这3个Entry,那么访问了a,就把a移到尾部去,即b,c,a。每次访问都把访问的那个数据移到双向队列的尾部去,那么每次要淘汰数据的时候,双向队列最前头的数据就是最不常访问的数据,即双向链表最前面的数据就是要淘汰的数据。 "访问"有两层意思:1.根据key拿到value,即get()方法; 2.修改key对应的value,即put()方法。
public static void main(String[] args) {
Map<String, String> map = new LinkedHashMap<String, String>(16,0.75f,true);
map.put("A","a");
map.put("B","b");
map.put("C","c");
map.put("D","d");
map.get("C");
map.get("A");
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
输出:
B=b
D=d
C=c
A=a