最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

HashMap vs TreeMap vs Hashtable vs LinkedHashMap

 更新時間:2019年07月01日 15:37:03   作者:風(fēng)一樣的碼農(nóng)  
這篇文章主要介紹了HashMap vs TreeMap vs Hashtable vs LinkedHashMap的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

Map是一個重要的數(shù)據(jù)結(jié)構(gòu),本篇文章將介紹如何使用不同的Map,如HashMap,TreeMap,HashTable和LinkedHashMap。

Map概覽

Java中有四種常見的Map實現(xiàn),HashMap,TreeMap,HashTable和LinkedHashMap,我們可以使用一句話來描述各個Map,如下:

HashMap:基于散列表實現(xiàn),是無序的;TreeMap:基于紅黑樹實現(xiàn),按Key排序;LinkedHashMap:保存了插入順序;Hashtable:是同步的,與HashMap類似;HashMap

如果HashMap的Key是自己定義的對象,那么一般需要覆蓋equals()和hashCode()方法,且要遵循他們之間的約定。

package simplejava;
import java.util.HashMap;
import java.util.Map.Entry;
class Dog {
  String color;
  Dog(String c) {
    color = c;
  }
  public String toString() {
    return color + " dog";
  }
}
public class Q26 {
  public static void main(String[] args) {
    HashMap<Dog, Integer> hashMap = new HashMap<Dog, Integer>();
    Dog d1 = new Dog("red");
    Dog d2 = new Dog("black");
    Dog d3 = new Dog("white");
    Dog d4 = new Dog("white");
    hashMap.put(d1, 10);
    hashMap.put(d2, 15);
    hashMap.put(d3, 5);
    hashMap.put(d4, 20);
    //print size
    System.out.println(hashMap.size());
    //loop HashMap
    for (Entry<Dog, Integer> entry : hashMap.entrySet()) {
    System.out.println(entry.getKey().toString() + " - " +
    entry.getValue());
    }
  }
}

結(jié)果輸出:

4
white dog - 5
red dog - 10
white dog - 20
black dog - 15

注意,我們不小心添加了兩個"white dogs“,但是HashMap仍然存儲它。這是不合理的,現(xiàn)在我們困惑到底有多少條白狗存入了HashMap,5還是20呢。

其實,Dog類應(yīng)該是這樣定義的:

class Dog {
  String color;
  Dog(String c) {
    color = c;
  }
  public boolean equals(Object o) {
    return ((Dog) o).color.equals(this.color);
  }
  public int hashCode() {
    return color.length();
  }
  public String toString() {
    return color + " dog";
  }
}

結(jié)果輸出:

3
red dog - 10
white dog - 20
black dog - 15

原因是因為HashMap不允許兩個相同的元素存入,默認情況下,Object的hashCode()和equals()會被用于判斷兩個對象是否相同。默認的hashCode()方法對于不同的對象會返回不同的值,而equals()方法只有當(dāng)兩個引用相等,即指向同一個對象的時候才返回true。如果你不是很清楚,可以自己檢驗下hashCode()和equals()之間的關(guān)系。

舉個例子,可以檢驗下HashMap中最常用的方法,如iteration,print等。

TreeMap

TreeMap是按key排序的,讓我們先看下如下代碼,了解其“按key排序”思想。

package simplejava;
import java.util.Map.Entry;
import java.util.TreeMap;
class Dog {
  String color;
  Dog(String c) {
    color = c;
  }
  public boolean equals(Object o) {
    return ((Dog) o).color.equals(this.color);
  }
  public int hashCode() {
    return color.length();
  }
  public String toString() {
    return color + " dog";
  }
}
public class Q26 {
  public static void main(String[] args) {
    Dog d1 = new Dog("red");
    Dog d2 = new Dog("black");
    Dog d3 = new Dog("white");
    Dog d4 = new Dog("white");
    TreeMap<Dog, Integer> treeMap = new TreeMap<Dog, Integer>();
    treeMap.put(d1, 10);
    treeMap.put(d2, 15);
    treeMap.put(d3, 5);
    treeMap.put(d4, 20);
    for (Entry<Dog, Integer> entry : treeMap.entrySet()) {
      System.out.println(entry.getKey() + " - " + entry.getValue());
    }
  }
}

結(jié)果輸出:

Exception in thread "main" java.lang.ClassCastException: simplejava.Dog cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1188)
at java.util.TreeMap.put(TreeMap.java:531)
at simplejava.Q26.main(Q26.java:34)

由于TreeSet是基于Key排序的,所以作為key的對象需要相互比較,這就是為什么key需要實現(xiàn)Comparable接口。舉個例子,你可以使用字符串作為Key,因為String已經(jīng)實現(xiàn)了Comparable接口。

現(xiàn)在,讓我們改變一下Dog,讓它可比較,如下:

package simplejava;
import java.util.Map.Entry;
import java.util.TreeMap;
class Dog implements Comparable<Dog> {
  String color;
  int size;
  Dog(String c, int s) {
    color = c;
    size = s;
  }
  public String toString() {
    return color + " dog";
  }
  @Override
  public int compareTo(Dog o) {
    return o.size - this.size;
  }
}
public class Q26 {
  public static void main(String[] args) {
    Dog d1 = new Dog("red", 30);
    Dog d2 = new Dog("black", 20);
    Dog d3 = new Dog("white", 10);
    Dog d4 = new Dog("white", 10);
    TreeMap<Dog, Integer> treeMap = new TreeMap<Dog, Integer>();
    treeMap.put(d1, 10);
    treeMap.put(d2, 15);
    treeMap.put(d3, 5);
    treeMap.put(d4, 20);
    for (Entry<Dog, Integer> entry : treeMap.entrySet()) {
      System.out.println(entry.getKey() + " - " + entry.getValue());
    }
  }
}

結(jié)果打?。?/p>

red dog - 10
black dog - 15
white dog - 20

在這個例子中,我們是按dog的size來排序的;

如果"Dog d4 = new Dog("white", 10);"被替換成"Dog d4 = new Dog("white",40);",結(jié)果將輸出如下信息:

white dog - 20
red dog - 10
black dog - 15
white dog - 5

這是因為當(dāng)前TreeMap使用compareTo()去比較key,不同的size意味著不同的dogs。

HashTable

參考java文檔:HashMap與HashTable基本類似,除了非同步和允許null外。

LinkedHashMap

LinkedHashMap是HashMap的子類,意味著它繼承了HashMap的特性,除此之外,LinkedHashMap還保存了插入順序。

讓我們使用同樣的代碼,然后將HashMap替換成LinkedHashMap,如下:

package simplejava;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
class Dog {
  String color;
  Dog(String c) {
    color = c;
  }
  public boolean equals(Object o) {
    return ((Dog) o).color.equals(this.color);
  }
  public int hashCode() {
    return color.length();
  }
  public String toString() {
    return color + " dog";
  }
}
public class Q26 {
  public static void main(String[] args) {
    Dog d1 = new Dog("red");
    Dog d2 = new Dog("black");
    Dog d3 = new Dog("white");
    Dog d4 = new Dog("white");
    LinkedHashMap<Dog, Integer> linkedHashMap = new LinkedHashMap<Dog, Integer>();
    linkedHashMap.put(d1, 10);
    linkedHashMap.put(d2, 15);
    linkedHashMap.put(d3, 5);
    linkedHashMap.put(d4, 20);
    for (Entry<Dog, Integer> entry : linkedHashMap.entrySet()) {
      System.out.println(entry.getKey() + " - " + entry.getValue());
    }
  }
}

輸出結(jié)果:

red dog - 10
black dog - 15
white dog - 20

如果我們使用HashMap,結(jié)果如下,區(qū)別在于沒有保存插入順序:

red dog - 10
white dog - 20
black dog - 15

更多閱讀:ArrayList vs. LinkedList vs. Vector

譯文鏈接:http://www.programcreek.com/2013/03/hashmap-vs-treemap-vs-hashtable-vs-linkedhashmap/

總結(jié)

以上所述是小編給大家介紹的HashMap vs TreeMap vs Hashtable vs LinkedHashMap的相關(guān)知識,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!

相關(guān)文章

  • Java中有什么工具可以進行代碼反編譯詳解

    Java中有什么工具可以進行代碼反編譯詳解

    這篇文章主要介紹了Java中有什么工具可以進行代碼反編譯的相關(guān)資,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、BytecodeViewer、Krakatau和JAD,每種工具都有其特點和適用場景,需要的朋友可以參考下
    2025-03-03
  • 使用springboot打包后的文件讀取方式

    使用springboot打包后的文件讀取方式

    這篇文章主要介紹了使用springboot打包后的文件讀取方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 了解java中的Clojure如何抽象并發(fā)性和共享狀態(tài)

    了解java中的Clojure如何抽象并發(fā)性和共享狀態(tài)

    Clojure是一種運行在Java平臺上的 Lisp 方言,Lisp是一種以表達性和功能強大著稱的編程語言,但人們通常認為它不太適合應(yīng)用于一般情況,而Clojure的出現(xiàn)徹底改變了這一現(xiàn)狀。,需要的朋友可以參考下
    2019-06-06
  • Java源碼跟蹤閱讀技巧【值得收藏】

    Java源碼跟蹤閱讀技巧【值得收藏】

    今天跟大家分享一下我平時閱讀源碼的幾個小技巧,對于閱讀Java中間件如Spring、Dubbo等框架源碼的同學(xué)有一定幫助。本文基于Eclipse IDE,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • SpringBoot中各個層級結(jié)構(gòu)的具體實現(xiàn)

    SpringBoot中各個層級結(jié)構(gòu)的具體實現(xiàn)

    在SpringBoot項目中,常常會把代碼文件放入不同的包中,本文主要介紹了SpringBoot中各個層級結(jié)構(gòu)的具體實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Java的編譯時錯誤和運行時錯誤問題

    Java的編譯時錯誤和運行時錯誤問題

    這篇文章主要介紹了Java的編譯時錯誤和運行時錯誤問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 使用Files.walkFileTree遍歷目錄文件

    使用Files.walkFileTree遍歷目錄文件

    這篇文章主要介紹了使用Files.walkFileTree遍歷目錄文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • mybatis resultmap 如何為對象賦值的調(diào)用順序

    mybatis resultmap 如何為對象賦值的調(diào)用順序

    這篇文章主要介紹了mybatis resultmap 如何為對象賦值的調(diào)用順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot中添加監(jiān)聽器及創(chuàng)建線程的代碼示例

    SpringBoot中添加監(jiān)聽器及創(chuàng)建線程的代碼示例

    這篇文章主要介紹了SpringBoot中如何添加監(jiān)聽器及創(chuàng)建線程,文中有詳細的代碼示例,具有一定的參考價值,需要的朋友可以參考下
    2023-06-06
  • Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解

    Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解

    這篇文章主要給大家介紹了關(guān)于Spring循環(huán)依賴的正確性,以及Bean注入的順序關(guān)系的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01

最新評論

永善县| 通河县| 高州市| 濮阳县| 玉门市| 若羌县| 桑日县| 西安市| 武安市| 和顺县| 寻甸| 措勤县| 德阳市| 浮梁县| 昌吉市| 尉氏县| 新民市| 宜良县| 五指山市| 昭觉县| 若尔盖县| 九江市| 苗栗县| 武强县| 瓦房店市| 天门市| 西华县| 洪江市| 汶川县| 恩平市| 泗水县| 宜章县| 昌邑市| 卓资县| 望谟县| 龙口市| 永吉县| 南华县| 鄢陵县| 班玛县| 周至县|