Java核心类库—集合框架—Set接口和HashSet类等
Set的Collection子接口,模拟了数学上的集的概念。
Set集合存储特点:
1.不允许元素重复
2.不会记录元素的先后添加顺序
Set只包含从Collection继承的方法,buguoSet无法记住添加的顺序,不允许包含重复的元素。当试图添加两个相同元素进Set集合,添加操作失败,add()方法返回false。
Set判断两个对象是否相等用equals,而不是用==。也就是说两个对象equals比较返回true,Set集合是不会接收这两个对象的。
HashSet是Set接口最常用的实现类,底层使用了哈希表(散列/hash)算法。
其底层其实也是一个数组,存在的意义是提供查询速度。
在一般数组中,元素在数组中的索引位置是随机的,元素的取值和元素的位置之间不存在确定的关系,因此,在数组中查找特定的值时,需要把查找值和一系列的元素进行比较。
此时的查询效率依赖于查找过程中所进行的比较次数。
如果元素的值(value)和在数组中的索引位置(index)有一个确定的对应关系(hash)
公式为:Index = hash(value);
那么对于给定的值,只要调用上述hash(value)方,就能找到数组中取值为value的元素位置。
对象的hashCode值决定了在哈希表中的位置
每一个存储到hash表中的对象,都得提供hashCode和equals方法,用来判断是否是同一个对象
存储在哈希表中的对象,都应该覆盖equals方法和hashCode方法,并且保证equals相等的时候,hashCode也应该相等
如果需要把我们自定义的对象存储到哈希表中,该类型的对象应该覆盖equals和hashCode方法,并在该方法中提供自己的判断规则。(可以使用eclipse开发工具自动生成)
LinkedHashSet:底层有哈希表和链表算法
哈希表:来保证唯一性,此时就是HashSet,在哈希表中元素没有先后顺序。
链表:来记录元素的先后顺序。
TreeSet集合底层才有红黑树算法,会对存储的元素默认使用自然排序(从大到小)
注意:必须保证TreeSet集合中的元素对象是相同的数据类型,否则报错
TreeSet的排序规则:
自然排序:
TreeSet调用集合元素的compareTo方法来比较元素的大小关系,然后将集合元素按照升序排列(从小到大)
注意:要求TreeSet集合中元素得实现java.util.Comparable接口
java.util.Comparable:可比较的
覆盖public int compareTo(Object o)方法,在该方法中编写比较规则
在方法中比较当前对象(this)和参数对象o做比较(严格上说比较的是对象中的数据,比如按照年龄排序)
this > 0;返回正整数1
this == 0;返回负整数-1
this < 0;返回0,此时认为两个对象为同一个对象
定制排序:(从小到大,按照名字长短来排序)
在TreeSet构造器中传递java.lang.Comparator对象,并覆盖public int compareTo(Object o1,Object o2)再编写比较规则