天天看點

深入Java集合學習系列:HashSet的實作原理深入Java集合學習系列:HashSet的實作原理

<a href="http://zhangshixi.iteye.com/blog/673143">深入Java集合學習系列:HashSet的實作原理</a>

  HashSet實作Set接口,由哈希表(實際上是一個HashMap執行個體)支援。它不保證set 的疊代順序;特别是它不保證該順序恒久不變。此類允許使用null元素。HashSet中不允許有重複元素,這是因為HashSet是基于HashMap實作的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是統一的一個private static final Object PRESENT = new Object();。HashSet跟HashMap一樣,都是一個存放連結清單的數組。

  HashSet中add方法調用的是底層HashMap中的put()方法,而如果是在HashMap中調用put,首先會判斷key是否存在,如果key存在則修改value值,如果key不存在這插入這個key-value。而在set中,因為value值沒有用,也就不存在修改value值的說法,是以往HashSet中添加元素,首先判斷元素(也就是key)是否存在,如果不存在這插入,如果存在着不插入,這樣HashSet中就不存在重複值。

  對于HashSet而言,它是基于HashMap實作的,HashSet底層使用HashMap來儲存所有元素,更确切的說,HashSet中的元素,隻是存放在了底層HashMap的key上, 而value使用一個static final的Object對象辨別。是以HashSet 的實作比較簡單,相關HashSet的操作,基本上都是直接調用底層HashMap的相關方法來完成, HashSet的源代碼如下:

View Code

對于HashSet中儲存的對象,請注意正确重寫其equals和hashCode方法,以保證放入的對象的唯一性。

本文轉自xwdreamer部落格園部落格,原文連結:http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532999.html,如需轉載請自行聯系原作者