Set接口:存储无序、不可重复的数据
HashSet 作为Set接口的主要实现类 线程不安全 可以存储null值
LinkedHashSet 作为HashSet子类,遍历其内部数据时,可以按照添加的顺序遍历
TreeSet:可以按照添加对象的指定属性进行排序
一、Set接口中没有额外定义新的方法
以HashSet为例
1.无序性:不等于随机性。存储的数据在底层数组并非按照数组索引的顺序添加,而是根据数据的哈希值
2.不可重复性:保证添加的元素按照equals()判断时,不能返回true。即相同的元素只能添加一个
二、添加元素的过程:以HashSet为例 底层数组+链表的结果
添加元素a,首先调用a所在类的hashCode()方法,计算a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置,判断
此数组此位置上是否已经有元素
如果此位置没有其他元素,则元素a添加成功
如果此位置上有其他元素(或以链表形式存在多个元素),则比较元素a与元素b的hash值
如果hash值不同,则a添加成功
如果hash值相同,则需要调用元素a所在类的equals()方法
equals()返回true,则a添加失败
equals()返回false,则添加成功
重写hashCode() 选择系数 31
要求:向Set中添加数据,其所在的类一定要重写hashCode()和equals()
向TreeSet中添加的数据,要求是相同类的对象。
两种排序:自然排序(实现Comparable接口)和定制排序(Comparator)
自然排序中,比较两个对象是否相同的标准为:compareTo()返回0。不再是equals()。
浙公网安备 33010602011771号