简谈Collection (下)

简谈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集合

(感谢各位大佬的观看,文中如果有问题,请各位大佬多多斧正!再次感谢)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值