五、Set接口
Set集合也相当于是一个容器,一旦把对象丢进容器中,集合中的多个对象之间没有明显的顺序
Set集合不允许重复元素进行添加,如果试图将两个相同的元素添加到一个Set集合中的时候,则add方法会返回false
1.HashSet
是Set接口的实现类,大多数如果要选用Set集合,一般直接选用HashSet
特点:
a.排重的【同一个元素不能重复添加,依靠hashCode()和equals()方法进行排重】
原理:如果两个对象的hashCode()值相同,并且通过equals()比较的结果返回是true,那么HashSet会认为这两个对象时同一个对象,在添加的时候只会添加一次
b.无序的【元素添加的顺序和底层存储的顺序不同,并不是随机的,是一套算法计算出来的,这个顺序并不是一成不变的,而是随时会发生改变】
c.底层存储采用的数据结构是哈希算法【具有很好的存取和查找性能】
原理:数组可以通过索引访问对应的元素,索引指出了元素在内存中存储的位置,而HashSet没有索引的,所以hashCode相当于是数组中的索引,决定每个元素在内存中的地址
d.HashSet不是同步的,如果多个线程访问同一个HashSet的时候,徐要考虑保证线程的同步
2.LinkedHashSet
LinkedHashSet是HashSet的子类,使用的方式和HashSet类似
特点:
a.排重的【依靠hashCode和equals方法】
b.有序的
c.底层存储采用的数据结构是:链表【类似LinkedList】
3.TreeSet
TreeSet是Set集合的一个实现类,同时也是SortedSet【作用:主要负责排序】的唯一实现类,它可以确保元素处于一个排序状态
特点:
a.排重的【排重方式:在排序的同时,会完成排序,排序方式:自然排序和定制排序】
b.有序的【元素添加到集合中,会按照特定的顺序进行排序,会按照排序后的顺序进行存储】
c.底层存储采用的数据结构:二叉树【红黑树】
排序方式:
自然排序:Treeset中添加元素的时候,会默认调用Compareble接口中的compareTo()方法,作用主要是为了比较大小,从而达到排序的效果【默认全部是升序的】
排序规则:只针对的是自定义的类
对于系统的一些类,已经重写过了compareTo()方法,比如String,Integer,Character,Data...【默认都是升序排序的】
obj1 int compareTo(Object obj2) :比较此对象与指定对象的顺序。
排序的同时排重: (x.compareTo(y)==0) == (x.equals(y))
正整数:obj1 > obj2
负整数:obj1 < obj2
0:obj1 == obj2【相当于obj1.equals(obj2) = true】