二、Set系列集合
1.Set系列集合概述
1)Set系列集合特点:
①无序:存取顺序不一致(只会无序一次,第二次执行与第一次一样)
②不重复
③无索引:没有带索引的方法
2)set集合实现类特点:
①Hashset:无序,不重复,无奈引
② LinkedHashset:有序,不重复,无奈引
③TreeSet:排序、不重复,无索引
Set集合的功能上基本上 Collection的API一致
2、HashSet元素无序的底层原理:哈希表
1)HashSet底层原理
①Hashsat集合底层采取哈希表存储的数据
②哈希表是一种对于增删改查数据性能都较好的结构
2)哈希表的组成
JDK8之后,底层来用(数组+链表+红黑树)相成3)哈东值哈希值跟数组的长度求余
3)哈希值(哈希值跟数组的长度求余)
是JDK根据对象的地址,按照某种规则(哈希值跟数组的长度求余)算出来的int类型的数值
4)Object类的API
public int hashCode()
返回对象的哈希值
5)对象的哈希值特点
①同一个对多次调用hashCde()方法返回的哈希值是相同的
②默认情况下,不同对象的哈希值是不同的.
3、HashSet元素去重复的底层原理
1)如果希望Set集合认为2个内容相同的对象是重夏的应该怎么办?
重写对的hashCode() 和equals()方法。
@Override
public int hashCode() {
return Objects.hash(age, name, sex);
}
/*
* 只要两个内容一样,结果一定是true
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
return age == other.age && Objects.equals(name, other.name) && sex == other.sex;
}
4、实现类:ListedHashSet
1)LinkedHashSet集合概述和特点
①有序,不重复,无索引
②这里有序指的是保证存储和取出的元素顺序一致
③原理:底层数据结构依哈希表,只是每元素又额外的多了一个双链表的机制记录存储的顺序。
5、实现类:TreeSet
1)TreeSet集合概述和特点
①不重复、无索引、可排序
②可排序:按照元素的大小默人升序(由小到大)排序
③TreeSet集合底层是基于红黑树数据结构实现排序的,增删改查性能都较好。
注:TreeSet 集合是一定要排序的,可以将元素按照指定的规则进行排序。
2)TreeSet集合默认的规则
①对于数值类型:Integer,Double
官方默认按照大小进行升序排序.
②对于字符串类型:默认按照首字母符的编号升序排序。
③对于自定义类型如Studert对象,Treset无法直接排序,需自己制定排序规则
3)自定义排序规则
Teset集合存储对象的时候有2种方式河以设计自定义比较规则
①方式一:
让自定义的类实现Comparable 接口重写里面的compareTo方法来定制比较规则
}
/*
* 方式一:自定义比较规则
* o1.compareTo(o2)
*/
@Override
public int compareTo(Apple o) {
// TODO Auto-generated method stub
// return this.weight-o.weight;//去除重量重复的元素
return this.weight-o.weight>=0? 1:-1;//保留重量重复的元素
}
@Override
public String toString() {
return “Apple [name=” + name + “, color=” + color + “, price=” + price + “, weight=” + weight + “]”;
}
③方式二:
TeeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则
// 方式二:集合自带比较器对象进行规则定制
//注意:如果TreeSet集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序
// Set a=new TreeSet<>(new Comparator() {
//
// @Override
// public int compare(Apple o1, Apple o2) {
// // TODO Auto-generated method stub
return o1.getWeight()-o2.getWeight();//升序
return o2.getWeight()-o1.getWeight();//降序
return Double.compare(o1.getPrice(), o2.getPrice());//升序
// return Double.compare(o2.getPrice(), o1.getPrice());//降序
// }
// });
Set a=new TreeSet<>((o1,o2)-> Double.compare(o2.getPrice(), o1.getPrice()));
a.add(new Apple(“红富士”,“红色”,18.9,500));
a.add(new Apple(“青苹果”,“青色”,9.9,300));
a.add(new Apple(“绿苹果”,“绿色”,20.9,200));
a.add(new Apple(“黄苹果”,“黄色”,9.8,500));
System.out.println(a);
注:如果TreeSet集合存储的对象有实现比较集合也自带比较器,默认使用集合自带的比较器排序.