Set集合接口
2019-04-06 / JAVA / 962 次围观 / 0 次吐槽 /Set:接口
1.一个不包含重复元素的 collection。
2.最多包含一个 null 元素
3.一般使用它实现类:HashSet,LinkedHashSet,TreeSet
4.Set集合存和取的顺序不一样,【每一次取的顺序都可能不一样】
对比List:接口
1.List是可存储相同元素
2.List存的取的元素顺序是一样
HashSet
1.此类实现 Set 接口
2.由哈希表(实际上是一个 HashMap 实例)支持。
3.它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。
4.此类允许使用 null 元素。
HashSet存储自定义对象保证元素唯一性
需要重写hashCode()和equals()方法
hashCode与equals的原理
通过set集合的add方法添加元素时,内部会调用hashcode和equals方法
如果比较的hashcode的值是一样的话,会调用equals方法,equals方法返回true,就不存元素,返回false就存元素
如果比较的hashcode的值不一样,就直接存元素
hashCode与equals的优化
1.如果名字不一样,就不需要调用equals方法,从而优化代码
return this.name.hashCode()
2.hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
return this.name.hashCode() + this.age;
LinkedHashSet
LinkedHashSet是HashSet的子类
LinkedHashSet 存和取的顺序是一样
TreeSet
TreeSet是一种能排序的集合
TreeSet的排序方式有2种
自然顺序(Comparable)
默认情况下,TreeSet存Integer时,由小到大排序
默认情况下,TreeSet存String时,字母的由小到大排序
Integer和String这两个类都内部实现了comparable接口
TreeSet保存自定义对象
自定义对象必须实现comparable接口
实现这个接口的目的是告诉TreeSet你的元素的排序规则
实现了comparable接口的类,要实现compareTo方法
compareTo方法:0-只存一个元素,第一个元素 -1:存的顺序倒序 1: 存的顺序正序
排序的原理 是使用二叉权存数据
0:不存 负数:存在左边 正数:存在右边
比较器顺序(Comparator)
public TreeSet(Comparator<? super E> comparator)
使用场景:如果元素的类型是final类型,不被重写,这个时候选择Comparator排序方式
如果希望有相同的元素存在,在compareTo或者compare方法,返回1就行了。
TreeSet排序原理总结
TreeSet的特点:
TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
TreeSet排序方式有两种自然顺序和比较器顺序
自然顺序(Comparable)
TreeSet类的add()方法中会把存入的对象提升为Comparable类型
调用对象的compareTo()方法和集合中的对象比较
根据compareTo()方法返回的结果进行存储
比较器顺序(Comparator)
创建TreeSet的时候可以制定 一个Comparator
如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的规则比较
add()方法内部会自动调用Comparator接口中compare()方法排序
调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
两种比较方式的区别
1.TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
2.TreeSet如果传入Comparator, 就优先按照Comparator
- 上一篇:集合嵌套之List嵌套List
- 下一篇:Map集合接口
Powered By Cheug's Blog
Copyright Cheug Rights Reserved.