溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中如何使用不同的Map

發(fā)布時(shí)間:2021-09-09 15:45:45 來源:億速云 閱讀:148 作者:小新 欄目:編程語言

這篇文章主要介紹了Java中如何使用不同的Map,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

如何使用不同的Map,如HashMap,TreeMap,HashTable和LinkedHashMap。

Map概覽

Java中如何使用不同的Map

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

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

如果HashMap的Key是自己定義的對(duì)象,那么一般需要覆蓋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

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

其實(shí),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

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

舉個(gè)例子,可以檢驗(yà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的對(duì)象需要相互比較,這就是為什么key需要實(shí)現(xiàn)Comparable接口。舉個(gè)例子,你可以使用字符串作為Key,因?yàn)镾tring已經(jīng)實(shí)現(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

在這個(gè)例子中,我們是按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

這是因?yàn)楫?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

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Java中如何使用不同的Map”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI