目录
Collection接口:
List:有顺序,元素可以重复,顺序指的是添加的先后顺序
Set:没有顺序(没有按照添加的顺序排列),元素不可以重复,顺序值的是添加的先后顺序
所谓的不能重复,默认情况下比较的是地址,引用数据类型重复还是可以添加的 eg:set.add(new x("",""));
那么:
Set集合如何确保数据的不重复:确保数据类型的类要重写hashCode和equals方法。
Set其实是有顺序的,内部其实是有一个专门排列的算法。
1.所谓的无序不等于随机
2.所谓的无序指的是没有按照添加的先后顺序,但其实内部是做了排序的。
内部结构:哈希表:由数组+链表+红黑树组成。
- HashSet集合底层采用了哈希表这种数据结构
- HashSet在实例化时,底层实际实例化了个HashMap
- 往HashSet集合中存储元素,实际存放到了HashMap集合的key部分
基本与HashSet一样
与HashSet的区别和联系:
H是L的父类,H内部结构复杂,L的结构就是链表但是实现Set接口
对HashSet的拓展:添加数据的同时维护数据的添加顺序,但也仅仅如此,你还是取不出来
操作数据的效率略低。
可以排序的Set集合
排序的规则:你要排序的对象的类必须实现Comparable接口
- TreeSet集合继承了SortedSet接口的特点(无序不可重复可自动排序)
- TreeSet集合底层采用了二叉树这种数据结构
- TreeSet在实例化时,底层实际实例化了个TreeMap
- 往TreeSet集合中存储元素,实际时存放到了TreeMap集合的key部分
为什么要重写compareTo方法,什么时候要重写compareTo方法
重写compareTo方法是为了在创建引用对象时,防止TreeSet集合把所有引用对象当成重复的,就默认只存储一个
想自定义排序规则,或用引用数据类型防止重复时。
重写:
- @Override
- public int compareTo(Person p) {
- //自己写排序规则
- if(this.id>p.id){
- return -1;//大的往前去
- }
- if(this.id.equals(p.id)){
- return 0;
- }
- if(this.id
- return 1;//小的往后去
- }
- return 0;
- }
为什么return返回的是1,0,-1:
compareTo方法返回的是int型:
负数-1:代表比较的两个值调用者小
0:两个值相等
正数1:比较的两个值大。
ps:负数代表:调用者往前去,正数往后去,0不动.