java中HashSet中的去重以及容量擴增原理

來源:互聯網
上載者:User

首先需要明白java中HastSet實際上是用散列表實現的,散列表的大小預設大小為16(也叫散列表元的數量),載入因子為0,75(下面會解釋什麼是載入因子)。


去重原理:當hashset add一個元素A的時候,首先擷取這個元素的散列碼(hashcode方法),假設散列碼為400,然後將散列碼對散列表元的數量模數,400%16=0;

0表示第一個元素,然後將元素A與散列表中的第一個鏈表中(模數為0,所以這裡是第一個鏈表)的每個元素進行比較,(通過equals進行比較~~)如果該鏈表中沒有找到與元素A相同的元素,則將元素A添加到該鏈表,如果找到某個元素與元素A相同,則表示Set中已經存在了該元素,不添加元素A。 

容量擴容原理:這裡先解釋下什麼是載入因子,當散列表中為非空的散列表元數量除以所有散列表元的數量>載入因子的時候,hashset就會進行再散列,即將散列表大小在原有基礎上x2,對所有元素進行重新散列,得到新的散列表,以前的散列表就沒用了~~。舉個簡單的例子:假設現在hashset散列表大小為·8,載入因子為0,75,hastset中元素有30個,第一個鏈表包含14個元素,第二個鏈表為空白(為空白記為0),以此類推分別為:14   0  0  4  2  2  2  6

現在set添加第31個元素B,B的散列值為9,9%b=1,所以將元素B與第二個鏈表中的元素進行去重比較,發現第二個鏈表為空白鏈表,所以將元素B添加到第二個鏈表。此時散列表各個鏈表的元素個數分別為14 1 0 4 2 2 2 6,非空鏈表除以整個鏈表的大小為7/8>0.75,這時就會進行再散列,散列表的大小為8x2=16。當元素不斷增加時,以此類推擴容。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.