一、HashSet类
实现了Set接口,无法存储重复元素
特点:元素位置无序、无索引、底层是HashMap
1、构造方法
内部是HashMap的构造方法
2、add方法
(1)元素在底层存储使用到了三种数据结构:hash数组、链表、树
(2)添加流程(根据hashcode值与hash数组长度取余计算出元素应该添加在hash数组的位置)
对于要添加的元素A,遍历集合,将A与集合中的每一个元素进行比较,如果两者的hash值不相等,则继续和下一个元素比较,否则使用equals方法比较两个元素的值是否相等,相等,则不将A添加到集合中,不相等,则继续和下一个元素比较,当和最后一个元素比较完成无异常情况时,将A添加到集合中
注:通话和重地两个词语的hashcode值相等但内容不同
(3)实现
(4)底层使用hashCode和equals,与单独使用equals相比,提高了效率,两者结合起来使用,也保证了安全
3、常用方法
4、hashCode和equals
Set集合中添加元素时调用的是元素类型中的hashCode和equals方法,如果没有,则会调用其父类中的方法
以String类为例,String类中重写了hashCode(使用内容生成hashcode值)和equals(比较内容是否相等),则可以在使用set集合添加String类型元素时不会将重复元素添加进去
如果使用自定义类,想要实现不包含内容上重复的元素,一定要重写hashCode和equals方法
Object类中的hashCode(这里面的东西哪去了???)和equals(比较的是对象的地址)
String类中的hashCode(使用内容生成hashcode码)和equals(通过内容进行比较)
--------------------------------------自定义一个类放入set集合------------------------------
未重写hashCode、equals、toString方法,会从父类中调用,会将内容重复的元素加到集合中
重写hashCode、equals、toString方法
实现只能将内容不重复的元素加入集合