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)再编写比较规则

 

posted @ 2017-03-19 15:20  wenxudong  阅读(259)  评论(0编辑  收藏  举报