且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

深入Java集合学习系列:HashSet的实现原理深入Java集合学习系列:HashSet的实现原理

更新时间:2022-09-17 20:05:50

0.参考文献

深入Java集合学习系列:HashSet的实现原理

1.HashSet概述:

  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中就不存在重复值。

2.HashSet的实现:

  对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,更确切的说,HashSet中的元素,只是存放在了底层HashMap的key上, 而value使用一个static final的Object对象标识。因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成, HashSet的源代码如下:

深入Java集合学习系列:HashSet的实现原理深入Java集合学习系列:HashSet的实现原理View Code

3. 相关说明:

  1. 相关HashMap的实现原理,请参考我的上一遍总结:深入Java集合学习系列:HashMap的实现原理
  2. 对于HashSet中保存的对象,请注意正确重写其equals和hashCode方法,以保证放入的对象的唯一性。


本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532999.html,如需转载请自行联系原作者