推薦博客:https://www.jianshu.com/p/8f4f58b4b8ab
區別:
- LinkedHashMap是繼承於HashMap,是基於HashMap和雙向鏈表來實現的。
- HashMap無序;LinkedHashMap有序,可分為插入順序和訪問順序兩種。如果是訪問順序,那put和get操作已存在的Entry時,都會把Entry移動到雙向鏈表的表尾(其實是先刪除再插入)。
- LinkedHashMap存取數據,還是跟HashMap一樣使用的Entry[]的方式,雙向鏈表只是為了保證順序。
- LinkedHashMap是線程不安全的。
LinkedHashMap應用場景
HashMap是無序的,當我們希望有順序地去存儲key-value時,就需要使用LinkedHashMap了。
Map<String, String> hashMap = new HashMap<String, String>(); hashMap.put("name1", "josan1"); hashMap.put("name2", "josan2"); hashMap.put("name3", "josan3"); Set<Entry<String, String>> set = hashMap.entrySet(); Iterator<Entry<String, String>> iterator = set.iterator(); while(iterator.hasNext()) { Entry entry = iterator.next(); String key = (String) entry.getKey(); String value = (String) entry.getValue(); System.out.println("key:" + key + ",value:" + value); }
我們是按照xxx1、xxx2、xxx3的順序插入的,但是輸出結果並不是按照順序的。
同樣的數據,我們再試試LinkedHashMap
Map<String, String> linkedHashMap = new LinkedHashMap<>(); linkedHashMap.put("name1", "josan1"); linkedHashMap.put("name2", "josan2"); linkedHashMap.put("name3", "josan3"); Set<Entry<String, String>> set = linkedHashMap.entrySet(); Iterator<Entry<String, String>> iterator = set.iterator(); while(iterator.hasNext()) { Entry entry = iterator.next(); String key = (String) entry.getKey(); String value = (String) entry.getValue(); System.out.println("key:" + key + ",value:" + value); }
結果可知,LinkedHashMap是有序的,且默認為插入順序。
插入順序和訪問順序。
LinkedHashMap默認的構造參數是默認 插入順序的,就是說你插入的是什么順序,讀出來的就是什么順序,但是也有訪問順序,就是說你訪問了一個key,這個key就跑到了最后面
這里accessOrder設置為false,表示不是訪問順序而是插入順序存儲的,這也是默認值,表示LinkedHashMap中存儲的順序是按照調用put方法插入的順序進行排序的。LinkedHashMap也提供了可以設置accessOrder的構造方法,我們來看看這種模式下,它的順序有什么特點?
// 第三個參數用於指定accessOrder值 Map<String, String> linkedHashMap = new LinkedHashMap<>(16, 0.75f, true); linkedHashMap.put("name1", "josan1"); linkedHashMap.put("name2", "josan2"); linkedHashMap.put("name3", "josan3"); System.out.println("開始時順序:"); Set<Entry<String, String>> set = linkedHashMap.entrySet(); Iterator<Entry<String, String>> iterator = set.iterator(); while(iterator.hasNext()) { Entry entry = iterator.next(); String key = (String) entry.getKey(); String value = (String) entry.getValue(); System.out.println("key:" + key + ",value:" + value); } System.out.println("通過get方法,導致key為name1對應的Entry到表尾"); linkedHashMap.get("name1"); Set<Entry<String, String>> set2 = linkedHashMap.entrySet(); Iterator<Entry<String, String>> iterator2 = set2.iterator(); while(iterator2.hasNext()) { Entry entry = iterator2.next(); String key = (String) entry.getKey(); String value = (String) entry.getValue(); System.out.println("key:" + key + ",value:" + value); }
因為調用了get("name1")導致了name1對應的Entry移動到了最后,這里只要知道LinkedHashMap有插入順序和訪問順序兩種就可以
TreeMap的用法(主要是排序)
TreeMap中默認的排序為升序,如果要改變其排序可以自己寫一個Comparator
import java.util.Comparator; import java.util.Iterator; import java.util.Set; import java.util.TreeMap; public class Compare { public static void main(String[] args) { TreeMap<String,Integer> map = new TreeMap<String,Integer>(new xbComparator()); map.put("key_1", 1); map.put("key_2", 2); map.put("key_3", 3); Set<String> keys = map.keySet(); Iterator<String> iter = keys.iterator(); while(iter.hasNext()) { String key = iter.next(); System.out.println(" "+key+":"+map.get(key)); } } } class xbComparator implements Comparator { public int compare(Object o1,Object o2) { String i1=(String)o1; String i2=(String)o2; return -i1.compareTo(i2); } }