天天看點

java map定義_Java中的Java.util.HashMap的定義以及用法 - Break易站

Java 集合架構

什麼是HashMap?

自1.2版以來,HashMap是Java中集合的一部分。它提供了Java的Map接口的基本實作。它将資料存儲在(Key,Value)對中。要通路一個值,你必須知道它的密鑰,否則,你不能通路它。HashMap被稱為HashMap,因為它使用了哈希技術。Hash,一般翻譯做散列、雜湊,或音譯為哈希,是把任意長度的輸入(又叫做預映射pre-image)通過雜湊演算法變換成固定長度的輸出,該輸出就是散列值。較短的值有助于索引和更快的搜尋。HashSet也在内部使用HashMap。它在内部使用連結清單來存儲鍵值對。我們将在其他文章中詳細了解HashSet。

HashMap的定義

public class HashMap extends AbstractMap implements

Map, Cloneable, Serializable

HashMap儲存在java.util包中。正如你在上面的HashMap定義中看到的那樣,它擴充了一個抽象類AbstractMap,它也提供了一個不完整的Map接口實作。正如你所看到的,它也實作了Cloneable和Serializable接口。 上述定義中的K和V分别代表Key和Value。 HashMap不允許重複的鍵,但允許重複的值。這意味着單個鍵不能包含多于1個值,但多于1個鍵可以包含單個值。HashMap也允許null鍵,但隻有一次和多個空值。這個類不能保證map的順序。它與HashTable大緻相似,但是不同步。

HashMap的内部結構

内部HashMap包含一個Node數組。并且節點被表示為包含4個字段的類:

int hash

K鍵

V值

下一個節點

java map定義_Java中的Java.util.HashMap的定義以及用法 - Break易站

我們可以看到該節點包含自己對象的引用。是以這是一個連結清單。 HashMap:

java map定義_Java中的Java.util.HashMap的定義以及用法 - Break易站

節點:

HashMap的時間複雜度

HashMap為基本操作提供了恒定的時間複雜度,如果散列函數被正确寫入并且它正确地将元素分散到桶中,則擷取和放入。HashMap上的疊代取決于HashMap的容量和鍵值對的數量。基本上它與容量+容量成正比。容量是HashMap中桶的數量。是以,最初在HashMap中保留大量的桶并不是一個好主意。

HashMap的性能

HashMap的性能取決于2個參數:

初始容量

負載因數

如前所述,容量隻是桶的數量,初始容量是HashMap執行個體建立時的容量。負載因數是在重新調整應該完成時的一種度量。重新粉刷是增加容量的過程。在HashMap中,容量乘以2. Load Factor也是衡量HashMap允許在再次散列之前填充的部分。當HashMap中的條目數量增加目前容量和負載因子的乘積時,容量增加,即正在進行重新哈希。如果我們将初始容量保持得更高,那麼重新調整将永遠不會完成。但通過保持較高的值,它會增加疊代的時間複雜度。是以應該非常巧妙地選擇它來提高性能。應該考慮預期的值的數量來設定初始容量。通常優先的負載因子值是0.75,這在時間和空間成本之間提供了很好的交易。負載因子的值在0和1之間變化。

同步HashMap

據了解,HashMap是不同步的,即多個線程可以同時通路它。如果多個線程同時通路這個類,并且至少有一個線程在結構上操作它,那麼有必要使它在外部同步。它通過同步封裝地圖的某個對象來完成。如果不存在這樣的對象,則可以将它包裝在Collections.synchronizedMap()中以使HashMap同步并避免意外的非同步通路。如下例所示:

Map m = Collections.synchronizedMap(new HashMap(..));

現在map m被同步。

如果在建立疊代器之後進行任何結構修改,除了通過疊代器的remove方法以外的任何其他方式,此類的疊代器都是快速失敗的。在疊代器失敗時,它會抛出ConcurrentModificationException。

HashMap的構造函數

HashMap提供了4個構造函數,每個通路修飾符都是public:

HashMap():它是預設的構造函數,它建立一個初始容量為16,加載因子為0.75的HashMap執行個體。

HashMap(int initial capacity):它建立一個具有指定初始容量和加載因子0.75的HashMap執行個體。

HashMap(int initial capacity,float loadFactor):它建立一個具有指定初始容量和指定加載因子的HashMap執行個體。

HashMap(Map map):使用與指定映射相同的映射建立HashMap的執行個體。

HashMap的方法:

// Java program to illustrate

// Java.util.HashMap

import java.util.HashMap;

import java.util.Map;

public class GFG

{

public static void main(String[] args)

{

HashMap<String, Integer> map = new HashMap<>();

print(map);

map.put("vishal", 10);

map.put("sachin", 30);

map.put("vaibhav", 20);

System.out.println("Size of map is:- " + map.size());

print(map);

if (map.containsKey("vishal"))

{

Integer a = map.get("vishal");

System.out.println("value for key \"vishal\" is:- " + a);

}

map.clear();

print(map);

}

public static void print(Map<String, Integer> map)

{

if (map.isEmpty())

{

System.out.println("map is empty");

}

else

{

System.out.println(map);

}

}

}

輸出:

output :- map is empty

Size of map is:- 3

{vaibhav=20, vishal=10, sachin=30}

value for key "vishal" is:-10

map is empty

HashMap中的方法