HashMap測試程序1
package com.iotek.map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class HashMapDemo1 {
public static void main(String[] args) {
// HashMap<String, String> map = new HashMap<String,String>();
Map<String, String> map = new HashMap<String,String>(); //接口的引用變量指向實現類的對象
//創建HashMap對象,也就是創建一個Map容器
map.put("jay", "張三"); //添加鍵值對元素
map.put("jay", "李四");
//有相同的鍵時,後面添加的鍵對應的值會覆蓋掉之前鍵對應的值
map.put("john", "李四");
//鍵名不同,鍵值相同,會保存重名的鍵值,也就是說值是可以重復的,鍵是不能重復的
map.put("rose", "玫瑰"); //添加鍵值對元素
map.put("mary", "小紅"); //添加鍵值對元素
System.out.println(map);
Set<String> keys = map.keySet();// 獲取map中所有鍵,返回的是一個Set容器,可以用叠代器對象或者foreach來進行輸出
System.out.println("******輸出map容器中所有的鍵:");
/*for(String key : keys) {
System.out.print(key + " "); //用String類型的變量key來遍歷keys容器
}*/
//獲取map中所有的值:使用map接口中的values方法,返回Collection接口的實現類
Collection<String> values = map.values();
System.out.println("\n******輸出map容器中所有的值:");
for(String value : values) {
System.out.print(value + " "); //用String類型的變量value來遍歷values容器
}
//得到key的同時,得到key所對應的值
System.out.println("\n******用獲取的鍵來得到對應的值並輸出:");
for(String key : keys) {
System.out.print(key + "--" + map.get(key)); //用String類型的變量key來遍歷keys容器
}
//map.get(Object key)方法返回的是指定的鍵所對應 的值,
System.out.println("\nmap容器中鍵值對的個數是:" + map.size());
System.out.println("判斷map容器中是否為空:" + map.isEmpty());
// map.entrySet()返回的是一個set容器,其中放的是map.Entry內部接口
/*當我們調用put(key,value)方法時,首先會把key和value封裝到Entry這個靜態內部類中,
* 再把Entry對象添加到數組中(哈希表),所以我們想要獲取map中的所有鍵值對,只需要獲取
* 數組匯總所有的Entry,接下來調用Entry對象中的getKey 和getValue方法就能獲取鍵值對
* 以後想輸出HashMap容器中所有的鍵值對,都可以調用HashMap的 entrySet()方法就可以了!!!*/
Set<Entry<String, String>> entrys = map.entrySet();
System.out.println("使用map接口的entrySet()方法獲取map容器中所有的鍵值對:");
for (Entry<String, String> entry : entrys) {
System.out.println(entry.getKey() + "-" + entry.getValue());
}
map.clear();
System.out.println("判斷map容器中是否為空:" + map.isEmpty());
}
}
/*
* hashmap調用默認構造方法會產生一個默認底層是長度為16的Entry數組,首先調用key的hasCode()方法來得到一個整數,
* int hash = hash(key.hashCode());
* 這個整數就是哈希碼,然後把哈希碼作為參數傳遞到hash()函數中來進行運算,即散列運算,得到一個int類型的散列值
* int i = indexFor(hash, table.length);
* 把散列值和數組的長度來進行運算,最終得到Entry對象要存放到數組的位置(下標)
*
* hashmap內部的結構是數組加單向鏈表結構,因為不同的key有可能計算出相同的散列值,根據散列值計算出來的存放到數組的下標
* 會沖突(同一個下標值),此時, 如果鍵相同,散列值也一樣,說明是同一個對象,此時會將鍵所對應的舊值用新的鍵值覆蓋掉
* 如果散列值一樣,鍵名不一樣,說明是不同的對象,此時會把鍵值對封裝成entry對象放到那個散列值對應的下標位置處,
* 原來那個entry對象會以鏈表形式鏈接在新創建的entry對象後面
*/
HashMap測試程序1