HashMap的實現原理

來源:互聯網
上載者:User

標籤:

  要瞭解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的實現原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.