Set集合
(1)定义:Set集合的特点
--无序,唯一
(2)属性:3点HashSet集合-2点TreeSet集合
1)HashSet集合(掌握)
1-底层数据结构是哈希表(是一个元素为链表的数组)
2-哈希表底层依赖两个方法:hashCode()和equals()
执行顺序:
首先比较哈希值是否相同
相同:继续执行equals()方法
返回true:元素重复了,不添加
返回false:直接把元素添加到集合
不同:就直接把元素添加到集合
@@String类重写hashCode()和equals(),所以可以把内容相同的字符串去掉
如果没有重写这两种方法,默认继承Object类的,一般不相同
3-如何保证元素唯一性的呢?
由hashCode()和equals()保证的
4-Java对于eqauls方法和hashCode方法是这样规定:
1.如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;
2.如果两个对象的hashCode相同,它们并不一定相同。
首先equals方法必须满足:
自反性(x.equals(x)必须返回true)
对称性(x.equals(y)返回true时,y.equals(x)也必须返回true)
传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)
一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值)
而且对于任何非null值的引用x,x.equals(null)必须返回false。
2)TreeSet集合--唯一/排序
--TreeSet集合是Set集合的一个子实现类,它是基于TreeMap中的NavigableSet接口实现的
1-底层数据结构是红黑树(是一个自平衡的二叉树)
唯一性:是根据比较的结果是否是0来决定
2-保证元素的排序方式
1.自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
2.比较器排序(集合具备比较性)
让集合构造方法接收Comparator的实现类对象
@如果同时有自然排序和比较器排序,以比较器排序为主
TreeSet集合的无参构造就是属于自然排序
添加到TreeSet中的数据类型必须是相同的
(3)注意:
虽然set集合元素无序,但作为集合它有自己的存储顺序
真正的比较是依赖于compareTo()方法;这个方法定义在Comparator接口中
二叉树:
元素的取出顺序(前序遍历,中序遍历,后续遍历)
从根节点开始,按照左,中,右的原则依次取出元素
(4)例外:LinkedHashSet:底层数据结构是哈希表和链表组成;
哈希表保证元素的唯一性;
链表保证元素的有序性