1. 程式人生 > 實用技巧 >LinkedHashMap和hashMap和TreeMap的區別

LinkedHashMap和hashMap和TreeMap的區別


回到頂部

區別:

  • 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按照的是插入順序,accessOrder為true按照的是訪問順序 1、插入順序訪問
 Map<String, String> linkedHashMap = new LinkedHashMap<>(16, 0.75f, false);
        linkedHashMap.put("name1", "josan1");
        linkedHashMap.put("name2", "josan2");
        linkedHashMap.put("name3", "josan3");
        System.out.println("開始時順序:");
        Set<Map.Entry<String, String>> set = linkedHashMap.entrySet();
        Iterator<Map.Entry<String, String>> iterator = set.iterator();
        while(iterator.hasNext()) {
            Map.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<Map.Entry<String, String>> set2 = linkedHashMap.entrySet();
        Iterator<Map.Entry<String, String>> iterator2 = set2.iterator();
        while(iterator2.hasNext()) {
            Map.Entry entry = iterator2.next();
            String key = (String) entry.getKey();
            String value = (String) entry.getValue();
            System.out.println("key:" + key + ",value:" + value);
        }

2、訪問順序訪問

     第三個引數用於指定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);
    }
}