定義:
JDK1.8中,HashMap採用位桶+鏈表+紅黑樹實現,當鏈表長度超過閾值(8)時,將鏈表轉換爲紅黑樹,這樣大大減少了查找時間。
實現原理:
首先有一個每個元素都是鏈表(可能表述不準確)的數組,當添加一個元素(key-value)時,就首先計算元素key的hash值,以此確定插入數組中的位置,但是可能存在同一hash值的元素已經被放在數組同一位置了,這時就添加到同一hash值的元素的後面,他們在數組的同一位置,但是形成了鏈表,同一各鏈表上的Hash值是相同的,所以說數組存放的是鏈表。而當鏈表長度太長時,鏈表就轉換爲紅黑樹,這樣大大提高了查找的效率。
結構:
遍歷方法:(有4種)
package comm;
/*1.可以採用keySet()+for循環的方法來遍歷,keySet()返回的是一個Key值的集合*/
import java.util.HashMap;
import java.util.Map;
public class HashMap_1 {
public static void main(String[] args) {
Map<String,String> map = new HashMap<String,String>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
for(String key: map.keySet()) {
System.out.println("key:" + key);
System.out.println("value:" + map.get(key));
}
}
}
package comm;
import java.util.Iterator;
import java.util.Map;
/*2.採用EntrySet()+Iterator進行遍歷,EntrySet()返回的是一個Map.Entry的一個集合,
* 它提供getKey(),getValue()方法來獲取鍵值對。*/
public class HashMap_2 {
Iterator<Map.Entry<String,String>> it = map.EntrySet().iterator();
while(it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println("key:" + entry.getKey());
System.out.println("value:" + entry.getValue());
}
}
package comm;
import java.util.Map;
/*3.直接採用EntrySet+for增強進行遍歷*/
public class HashMap_3 {
public static void main(String[] args) {
for(Map.Entry<String,String> entry:map.entrySet()) {
System.out.println("key:" + entry.getKey());
System.out.println("values:" + entry.getValue());
}
}
}
package comm;
/*4.取出所有value的值,但是不能取出KEY值*/
public class HahsMap_4 {
public static void main(String[] args) {
for(String value:map.values())
{
<pre name = "code" class = "html"> System.out.println("value:" + value);
}
}
}
參考鏈接:
面試必備技能:HashMap哪些技術點會被經常問到?
https://www.cnblogs.com/shihaiming/p/11399430.html
什麼是Hashmap
https://blog.csdn.net/qq_36711757/article/details/80394272
Java中HashMap底層實現原理(JDK1.8)源碼分析
https://www.cnblogs.com/little-fly/p/7344285.html
補充:
外存——鏈式存儲:雖然最大限度地利用了磁盤的存儲空間但是畢竟在增刪改查的數據操作上的速度不如順序存儲,
內存——順序存儲:因爲它的讀寫速度非常非常快,因此我們上述的每次刪除之後的重新整理的速度也非常快,因此我們的內存使用的是順序存儲方式,這樣不會速度很慢,而且也方便了增刪改查的操作。