標籤:
要瞭解HashMap的實現原理,首先得知道散列表(雜湊表).
一、散列表
散列表是一種可以快速地尋找所需要的對象的資料結構,散列表為每個對象計算一個整數,稱為散列碼(hash code),散列碼是由對象的執行個體域產生的一個整數。具有不同的資料域對象將產生不同的散列碼,java中的散列碼是通過hashcode方法實現的。
在java中,散列表用鏈表和數組實現,每個列表稱為桶,要想尋找表中對象的位置,就要先計算它的散列碼,然後與桶的總數取餘,所得到的結果就是儲存這個元素的桶的索引。比如一個大小為16的桶,散列碼為12的對象,應儲存在他的12%16=12號桶中,如果散列碼為28的對象,28%16=12,也應該儲存在12號桶中,只需在原有的基礎上再添加元素就行。
二、類比HashMap
HashMap的實現原理就是雜湊表,只不過HashMap的需要判斷鍵不能重複,如果重複,用新的值覆蓋舊的值。我用LinkedList數組類比實現HashMap中的put和get方法。LinkedList中裝的是Entry內部類,裡面有key和value屬性
package test;import java.util.LinkedList;public class MyMap<K,V> { private LinkedList[] table; private int size; public MyMap(){ this(16); } public MyMap(int capacity){ table = new LinkedList[capacity]; } @SuppressWarnings("unchecked") public void put(K key,V value){ Entry e = new Entry(key,value); //得到hash值,使hash的值都為正數 int hash = key.hashCode()%table.length; hash = hash>0?hash:-hash; LinkedList link = table[hash]; if(link == null){ table[hash] = new LinkedList(); table[hash].add(e); }else{ //判斷鍵是否有重複的,有就覆蓋,沒有就添加 for(int i=0;i<link.size();i++){ Entry entry = (Entry) link.get(i); if(entry.key.equals(key)){ entry.value = value; return; } } table[hash].add(e); } size++; } public V get(K key){ int hash = key.hashCode()%table.length; hash = hash>0?hash:-hash; LinkedList link = table[hash]; if(link!=null){ for(int i=0;i<link.size();i++){ Entry entry = (Entry) link.get(i); if(entry.key.equals(key)){ return (V) entry.value; } } } return null; } public int size(){ return size; } class Entry<K,V>{ K key; V value; public Entry(){ } public Entry(K key,V value){ this.key = key; this.value =value; } } @SuppressWarnings("unchecked") public static void main(String[] args) { MyMap myMap = new MyMap(); myMap.put(1, "aaaa"); myMap.put(1, "bbbb"); myMap.put(2, "cccc"); System.out.println(myMap.get(2)); System.out.println(myMap.size()); }}
參考資料:107尚學堂_高淇_java300集最全課程_容器_自己實現HashMap_Map底層實現_雜湊演算法實現_使用數組和鏈表
HashMap的實現原理