简谈Collection (下)
文章目录
Set集合的概念
Set集合存储是无序的,不重复的,无索引的
Set集合的实现类
HashSt 无序的(存取数据的顺序是不一样的),不重复的,无索引的
LInkedHashSet 有序的(存储顺序),不重复,无索引
TreeSet 排序 ,无重复,无索引
他们的区别是什么?
HashSt 的底层是基于哈希表进行实现的,在JDK8之前是 数组加链表,之后是 数组加链表加红黑树 增删改查效率都较快
LinkedHashSet的底层是基于链表结构的,,因为是链表,所以每个元素都包含一个值和指向下一个元素的指针,所以是有序的 增删改查效率都较快
TreeSet 底层是 红黑树 可以自定义排序规则 增删改查效率都较快
HashSt
HashSet无序的原理
的那个想HashSet集合存入一个数据,HashSet会调用该对象的hashcode方法得到一个hashcode的值,然后根据得到的hashcode的值确定对象在HashSet集合捏的存储位置,然后拿这个地址跟集合内的数据进行比较,看是否一致,若地址不一样则判定是不同的对象,如果希望Set集合认为2个内容一个的引用类型数据对象是重复的,那么需要重写对象的HashCode和equals方法
Set<Student> set=new HashSet<>();
set.add(new Student("张三", 25, '女'));
set.add(new Student("张三", 25, '女'));
set.add(new Student("李四", 18, '男'));
set.add(new Student("王五", 30, '男'));
set.forEach(System.**out**::println);
public class Student {
private String name;
private int age;
private char sex;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && sex == student.sex && Objects.**equals**(name, student.name);
}
@Override
public int hashCode() {
return Objects.**hash**(name, age, sex);
}
//省略JavaBean方法
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLj6m7J7-1689665340953)(file:///C:\Users\13601\AppData\Local\Temp\ksohtml11408\wps1.jpg)]
LInkedhashSet
有序的(存储顺序),不重复,无索引
LInkedhashSet有序的原理
LInkedhashSet是HashSet的子类,所以也是基于哈希表来确定存储位置,但是每个元素又额外的多了一个双链表的机制记录存储的数据顺序
Set<Integer> set = new LinkedHashSet<>(); // 有序,不重复,没有索引可以用
set.add(78); //存储2个相同的数据
set.add(78);
set.add(69);
set.add(90);
set.add(100);
System.**out**.println(set);//输出的顺序跟存储的顺序是一样的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T1TP34GA-1689665340954)(file:///C:\Users\13601\AppData\Local\Temp\ksohtml11408\wps2.jpg)]
TreeSet
排序(默认升序) ,无重复,无索引
TreeSet排序的原理
对于数值类的,Integer Double 官方默认进行升序排序
对于字符串类型,默认按照字符的哈希表编号进行升序排序
对于自定义数据类型的,TreeSet无法进行直接排序,需要进行指定排序规则,实体类需要实现 Comparable接口,重新compareTo方法来制定比较规则
代码:
Set<Student> set=new TreeSet<>();//排序,不重复,无索引
set.add(new Student("张三", 25, '女'));
set.add(new Student("张三", 25, '女'));
set.add(new Student("李四", 18, '男'));
set.add(new Student("王五", 30, '男'));
set.forEach(System.**out**::println);
public class Student implements Comparable<Student> {
private String name;
private int age;
private char sex;
//根据年龄来排序
@Override
public int compareTo(Student o) {
return this.age-o.getAge();
}
//省略javaBean方法
//省略重写HashCode和equals方法
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RpT1DfLe-1689665340955)(file:///C:\Users\13601\AppData\Local\Temp\ksohtml11408\wps3.jpg)]
总结
如果处理有重复数据的查询操作可以使用ArrasList集合
如果处理有重复数据的在增删操作可以使用LinkedList集合
如果处理无重复数据的操作可以使用HashSet集合
如果处理无重复数据但是需要记录数据存取顺序操作可以使用LinkedHashSet集合
如果处理无重复数据但是需要对数据进行排序操作可以使用TreeSet集合
(感谢各位大佬的观看,文中如果有问题,请各位大佬多多斧正!再次感谢)
操作可以使用HashSet集合
如果处理无重复数据但是需要记录数据存取顺序操作可以使用LinkedHashSet集合
如果处理无重复数据但是需要对数据进行排序操作可以使用TreeSet集合
(感谢各位大佬的观看,文中如果有问题,请各位大佬多多斧正!再次感谢)