LinkedHashMap和hashMap和TreeMap的區別


推薦博客: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);
    }
}

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM