[TOC]
## **1 什么是Java HashMap**
Java HashMap類通過使用哈希表來實現Map接口。HashMap繼承了AbstractMap類并實現Map接口。
Java HashMap要記住的核心要點:
* Java HashMap類包含key-value對。
* Java HashMap類不能存儲重復數據(key不能重復)。
* Java HashMap類可以包含一個或多個null值。
* Java HashMap類是非同步的(線程不安全)。
* Java HashMap類元素是無序的。
* Java HashMap類的初始默認容量為16,負載因子為0.75。
<br>
<br>
## **2 Java HashMap的層次結構**
:-: 
如上圖所示,HashMap類繼承了AbstractMap類并實現了Map接口。
:-: 
<br>
<br>
## **3 Java HashMap的語法**
~~~java
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
~~~
基本類型對應的包裝類表如下:
| 基本類型 | 引用類型 |
| --- | --- |
| boolean | Boolean |
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
HashMap 類位于 java.util 包中,使用前需要引入它,語法格式如下:
~~~
import java.util.HashMap; // 引入 HashMap 類
~~~
<br>
<br>
## **4 Java HashMap的構造方法**
| 構造方法 | 描述 |
| --- | --- |
| HashMap() | 用于構造默認的HashMap。 |
| HashMap(Map m) | 用于通過使用給定Map對象的元素來初始化HashMap。 |
| HashMap(int capacity) | 用于將HashMap的容量初始化為給定的整數值。 |
| HashMap(int capacity, float loadFactor) | 用于通過使用其參數來初始化HashMap的容量和負載因子。 |
<br>
<br>
## **5 Java HashMap的方法**
| 方法 | 描述 |
| --- | --- |
| [void clear()]() | 用于刪除Map中的所有數據。 |
| [boolean isEmpty()]() | 如果Map不包含元素,則用于返回true。 |
| [Object clone()]() | 用于返回此HashMap實例的淺表副本:鍵和值本身不會被克隆。 |
| [Set entrySet()]() | 用于返回Map中包含的Entry的Set集合。 |
| [Set keySet()]() | 用于返回Map中所有key的Set視圖。 |
| [V put]() | 用于在Map中插入一個條目。 |
| [void putAll(Map map)]() | 用于在Map中插入指定的Map。 |
| [V putIfAbsent(K key, V value)]() | 僅當尚未將指定值和指定鍵插入Map時,才將其插入。 |
| [V remove(Object key)]() | 用于刪除指定key的條目。 |
| [boolean remove(Object key, Object value)]() | 從Map中刪除具有關聯的指定鍵的指定值。 |
| [V compute(K key, BiFunction remappingFunction)]() | 用于計算指定鍵及其當前映射值的Map(如果沒有當前映射,則為null)。 |
| [V computeIfAbsent(K key, Function mappingFunction)]() | 如果指定的鍵尚未與值關聯(或已映射為null),則使用給定的映射函數計算它的值,除非為null,否則將其輸入到此Map中。 |
| [V computeIfPresent(K key, BiFunction remappingFunction)]() | 如果指定鍵的值存在且非空,則用于給定鍵及其當前映射值的情況下計算新映射。 |
| [boolean containsValue(Object value)]() | 如果Map中存在等于該值的某個值,則此方法返回true,否則返回false。 |
| [boolean containsKey(Object key)]() | 如果Map中存在等于該鍵的某個鍵,則此方法返回true,否則返回false。 |
| [boolean equals(Object o)]() | 用于將指定的Object與Map進行比較。 |
| [void forEach(BiConsumer action)]() | 對Map中的每個條目執行給定的操作,直到所有條目都已處理或該操作引發異常為止。 |
| [V get(Object key)]() | 返回根據key獲取的value對象。 |
| [V getOrDefault(Object key, V defaultValue)]() | 返回根據key獲取的value對象,如果Map不包含該key的值,則返回默認值defaultValue。 |
| [V merge(K key, V value, BiFunction remappingFunction)]() | 如果指定的鍵尚未與值關聯或與null關聯,請將其與給定的非null值關聯。 |
| [V replace(K key, V value)]() | 將指定的值替換為指定的鍵。 |
| [boolean replace(K key, V oldValue, V newValue)]() | 用指定鍵的新值替換舊值。 |
| [void replaceAll(BiFunction function)]() | 用在該條目上調用給定函數的結果替換每個條目的值,直到處理完所有條目或該函數引發異常為止。 |
| [Collection values()]() | 返回Map中所有value的Set集合。 |
| [int size()]() | 返回Map的元素個數。 |
以下實例我們創建一個 HashMap 對象 map, 整型(Integer)的 key 和字符串(String)類型的 value:
<br>
<br>
## **6 Java HashMap例子:add()**
~~~java
import java.util.*;
class da01HashMap{
public static void main(String args[]){
HashMap<Integer,String> hm=new HashMap<Integer,String>();
System.out.println("初始化HashMap: "+hm);
hm.put(100,"Eric");
hm.put(101,"Jack");
hm.put(102,"Rose");
System.out.println("執行put()方法后 ");
for(Map.Entry m:hm.entrySet()){
System.out.println(m.getKey()+" "+m.getValue());
}
hm.putIfAbsent(103, "Lucy");
System.out.println("執行putIfAbsent()方法后 ");
for(Map.Entry m:hm.entrySet()){
System.out.println(m.getKey()+" "+m.getValue());
}
HashMap<Integer,String> map=new HashMap<Integer,String>();
map.put(104,"Macy");
map.putAll(hm);
System.out.println("執行putAll()方法后 ");
for(Map.Entry m:map.entrySet()){
System.out.println(m.getKey()+" "+m.getValue());
}
}
}
~~~
**運行結果:**
初始化HashMap: {}
執行put()方法后
100 Eric
101 Jack
102 Rose
執行putIfAbsent()方法后
100 Eric
101 Jack
102 Rose
103 Lucy
執行putAll()方法后
100 Eric
101 Jack
102 Rose
103 Lucy
104 Macy
<br>
<br>
## **7 Java HashMap例子:remove()**
~~~java
import java.util.*;
class da01HashMap{
public static void main(String args[]){
HashMap<Integer,String> map=new HashMap<Integer,String>();
map.put(100,"Eric");
map.put(101,"Jack");
map.put(102,"Paul");
map.put(103, "Rose");
System.out.println("初始化HashMap: "+map);
//刪除元素
map.remove(100);
System.out.println("更新后: "+map);
//刪除元素
map.remove(101);
System.out.println("更新后: "+map);
//刪除元素
map.remove(102, "Paul");
System.out.println("更新后: "+map);
}
}
~~~
**運行結果:**
初始化HashMap: {100=Eric, 101=Jack, 102=Paul, 103=Rose}
更新后: {101=Jack, 102=Paul, 103=Rose}
更新后: {102=Paul, 103=Rose}
更新后: {103=Rose}
<br>
<br>
## **8 Java HashMap例子:replace()**
~~~java
import java.util.*;
class da01HashMap{
public static void main(String args[]){
HashMap<Integer,String> hm=new HashMap<Integer,String>();
hm.put(100,"Eric");
hm.put(101,"Jack");
hm.put(102,"Rose");
System.out.println("初始化HashMap:");
for(Map.Entry m:hm.entrySet())
{
System.out.println(m.getKey()+" "+m.getValue());
}
System.out.println("更新后:");
hm.replace(102, "Rose");
for(Map.Entry m:hm.entrySet())
{
System.out.println(m.getKey()+" "+m.getValue());
}
System.out.println("更新后:");
hm.replace(101, "Jack", "Mark");
for(Map.Entry m:hm.entrySet())
{
System.out.println(m.getKey()+" "+m.getValue());
}
System.out.println("更新后:");
hm.replaceAll((k,v) -> "Lucy");
for(Map.Entry m:hm.entrySet())
{
System.out.println(m.getKey()+" "+m.getValue());
}
}
}
~~~
**運行結果:**
初始化HashMap:
100 Eric
101 Jack
102 Rose
更新后:
100 Eric
101 Jack
102 Rose
更新后:
100 Eric
101 Mark
102 Rose
更新后:
100 Lucy
101 Lucy
102 Lucy
## **9 HashSet和HashMap的區別**
HashSet僅僅包含value值,而HashMap是key-value對象(鍵和值對)
- Java自動化測試
- 第一章:Java:基礎內容
- 1.1:Java:Hello Word
- 1.2:Java:熱身
- 1.3:Java:注釋
- 1.4:Java:標識符
- 1.5:Java:常量
- 1.6:Java:基本數據類型
- 1.7:Java:引用類型
- 1.8:Java:String類
- 第二章:Java:運算符
- 2.1:Java:算數運算符
- 2.2:Java:關系運算符
- 2.3:Java:邏輯運算
- 2.4:Java:賦值運算符
- 2.5;Java:三元運算符
- 2.6:Java:位運算符
- 第三章:Java:循環控制語句
- 3.1:Java:for循環
- 3.2:Java:while循環
- 3.3:Java:switch
- 3.4:Java:if else
- 3.5:Java:練習題
- 第四章:Java:函數與全局/局部變量
- 4.1:Java:局部變量
- 4.2:Java:全局變量
- 第五章:Java:方法
- 5.1:Java:初識方法
- 5.2:Java:方法調用
- 5.3:Java:方法重載
- 5.4:Java:構造方法
- 5.5:Java:方法的注意事項
- 第六章:Java:面向對象
- 6.1:Java:小案例
- 6.2:Java:this 關鍵字
- 6.3:Java:super 關鍵字
- 6.4:Java:static 關鍵字
- 6.5:Java:final關鍵字
- 6.6:Java:instanceof 運算符
- 6.7:Java:面向對象之封裝
- 6.8:Java:面向對象之繼承
- 6.9:Java:面向對象之多態
- 第七章:Java:面向對象高級進階
- 7.1:Java:抽象類
- 7.2:Java:Java中String類
- 7.3:Java:interface接口
- 7.4:Java:ArrayList
- 7.5:Java:HashSet
- 7.6:Java:HashMap
- 7.7:Java:反射(reflection)
- 第八章:Java:日志以及異常捕獲
- 8.1:Java:log4j
- 8.2:Java:異常初識基礎
- 8.3:Java:未被捕獲的異常
- 8.4:Java:try和catch的使用
- 8.5:Java:多重catch語句的使用
- 8.6:Java:throws/throw 關鍵字
- 8.7:Java:finally關鍵字
- 8.8:Java:自定義異常
- 第九章:Java:xml and IO
- 9.1:Java:IO基本概念
- 9.2:java:properties
- 9.3:Java:xml基本介紹
- 9.4:Java:xml操作實例
- 第十章:Java:JDBC編程
- 10.1:Java:JDBC介紹
- 10.2:Java:JDBC查詢
- 10.3:Java:JDBC插入
- 10.4:Java:Batch
- 10.5:Java:JDBC連接池
- 第十一章:Java:TestNG
- 11.1:java:TestNG簡介
- 11.2:Java:TestNG小實例
- 11.3:Java:TestNG.xml文件配置
- 11.4:Java:TestNG基本注解
- 11.5:Java:TestNG注解代碼
- 11.6:Java:TestNG預期異常
- 11.7:Java:TestNG忽略測試
- 11.8:Java:TestNG超時測試
- 11.9:Java:TestNG分組測試