HashSet<Student> set = new HashSet<>();
Student aaa = new Student("aaa", 18); //标记一
set.add(aaa);
set.add(new Student("bbb", 18));
set.add(new Student("aaa", 18)); //标记二
set.add(aaa);
//Student类略,里面重写了equals和hashCode方法
问题一:标记一的对象和标记二的对象,他们的哈希值是一样的吗? 如何验证?
我对HashSet的理解如下:
底层哈希表结构(数组+链表+红黑树),由哈希表保证元素唯一,实际上是HashMap中value=null的实现.
哈希表的原理: 哈希表底层是数组+链表+红黑树,依赖于hashCode和equals方法
数组存储元素哈希值, 哈希值相同的存储在链表中,链表节点超过8个,链表换成红黑树,因为红黑树效率高
存储元素时底层要做的判断:
1.调用元素的hashCode()方法,遍历数组,有没有这个哈希值,没有就直接存储
2.数组中已经有哈希值相同的,那么就调用元素的equals()方法,和哈希值相同的元素进行一一比较
3.equals()方法比较,有相等的就不存储,不相等就存储
不确定,虽然重写了
hashCode
,但是并不知道里面写了什么逻辑…用 哈希算法 算出来的,不同的数据类型不一样,比如
Integer
的hashCode
就是自己的值,String
的hashCode
是根据内容进行计算出来的,可以看一下这篇文章修正:
不需要遍历,
hashCode
再计算一下就得到了数组下标,直接访问对应的数组元素