一、LinkedHashMap
1.1 应用场景
HashMap是无序的,当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了。
1.2 插入顺序和访问顺序
LinkedHashMap默认的构造参数是默认 插入顺序的,就是说你插入的是什么顺序,读出来的就是什么顺序,但是也有访问顺序,就是说你访问了一个key,这个key就跑到了最后面 这里accessOrder设置为false,表示不是访问顺序而是插入顺序存储的,这也是默认值,表示LinkedHashMap中存储的顺序是按照调用put方法插入的顺序进行排序的。LinkedHashMap也提供了可以设置accessOrder的构造方法,我们来看看这种模式下,它的顺序有什么特点?
1 // 第三个参数用于指定accessOrder值 2 Map<String, String> linkedHashMap = new LinkedHashMap<>(16, 0.75f, true); 3 linkedHashMap.put("name1", "josan1"); 4 linkedHashMap.put("name2", "josan2"); 5 linkedHashMap.put("name3", "josan3"); 6 System.out.println("开始时顺序:"); 7 Set<Entry<String, String>> set = linkedHashMap.entrySet(); 8 Iterator<Entry<String, String>> iterator = set.iterator(); 9 while(iterator.hasNext()) { 10 Entry entry = iterator.next(); 11 String key = (String) entry.getKey(); 12 String value = (String) entry.getValue(); 13 System.out.println("key:" + key + ",value:" + value); 14 } 15 System.out.println("通过get方法,导致key为name1对应的Entry到表尾"); 16 linkedHashMap.get("name1"); 17 Set<Entry<String, String>> set2 = linkedHashMap.entrySet(); 18 Iterator<Entry<String, String>> iterator2 = set2.iterator(); 19 while(iterator2.hasNext()) { 20 Entry entry = iterator2.next(); 21 String key = (String) entry.getKey(); 22 String value = (String) entry.getValue(); 23 System.out.println("key:" + key + ",value:" + value); 24 }
二、TreeMap
2.1 概述
- TreeMap存储K-V键值对,通过红黑树(R-B tree)实现;
- TreeMap继承了NavigableMap接口,NavigableMap接口继承了SortedMap接口,可支持一系列的导航定位以及导航操作的方法,当然只是提供了接口,需要TreeMap自己去实现;
- TreeMap实现了Cloneable接口,可被克隆,实现了Serializable接口,可序列化;
- TreeMap因为是通过红黑树实现,红黑树结构天然支持排序,默认情况下通过Key值的自然顺序进行排序;
- TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n) 。
