HashSet的使用和原理

1、HashSet实际上是一个HashMap实例,都是一个存放链表的数组,它不保证存储元素的迭代顺序,此类允许使用null元素。

2、HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的。3、HashSet中的元素都存放在HashMap中的key上,而value中的值都是统一的一个固定对象private static final Object PRESENT = new Object();

4、HashSet中add方法调用的是底层HashMap中的put()方法,在HashMap调用put,首先会判断key是否存在,如果key存在,则修改value值,如果key不存在,插入这个key-value。而在Set中,因为value值没有用,也就不存在修改value值,因此往HashSet中添加元素,首先判断元素(也就是key)是否存在,如果不存在就插入,如果存在则不插入,这样HashSet中就不存在重复值。

5、HashSet采用的是哈希表结构,其添加数据的原理是:

当向集合中增加对象时,首先集合计算要增加对象的hashCode码,根据该值来得到一个位置用来存放当前对象,如果该位置没有一个对象存在的话,那么集合Set认为该对象在集合中不存在,直接增加进去。如果该位置有一个对象的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象,再进行一次散列,将该对象放到散列后计算出的新地址里。如果equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了。

6、在哈希表中判断两个元素是否重复要用到hashCode()、equals()。hashCode()决定数据在表中的存储位置,而equals()判断是否存在相同数据。

7、Y = K(X):K是函数,X是哈希码,Y是地址。 

posted @ 2020-01-01 19:41  我有两个皮夹克  阅读(1034)  评论(0编辑  收藏  举报