Java——类集框架:Set集合接口的详解及应用举例

举报
Winter_world 发表于 2021/09/28 22:39:26 2021/09/28
【摘要】 目录 1、Set集合接口 2、关于TreeSet排序 3、关于重复元素 4、小结 1、Set集合接口 Set也是Collection的子接口,主要特点是保存的数据不允许出现重复。但Set子接口并不像List子接口那样,针对Collection接口进行扩展,而是完整按照Collection接口标准实现了继承,所以没有get方...

目录

1、Set集合接口

2、关于TreeSet排序

3、关于重复元素

4、小结


1、Set集合接口

Set也是Collection的子接口,主要特点是保存的数据不允许出现重复。但Set子接口并不像List子接口那样,针对Collection接口进行扩展,而是完整按照Collection接口标准实现了继承,所以没有get方法。

Set子接口有两个常用子类:TreeSet(有序)、HashSet(无序)。

【举例】:观察HashSet子类:HashSet最大特点是不允许保存重复元素,且无序排列。


  
  1. Set<String> all = new HashSet<String>();
  2. all.add("Hello");
  3. all.add("World");
  4. all.add("good");
  5. all.add("dog");
  6. all.add("cat");
  7. all.add("Hello"); //重复元素不保存
  8. System.out.println(all);

【举例】:观察TreeSet子类:数据不允许重复,根据升序排列


  
  1. Set<String> all = new TreeSet<String>();
  2. all.add("Hello");
  3. all.add("World");
  4. all.add("good");
  5. all.add("dog");
  6. all.add("cat");
  7. all.add("Hello");
  8. System.out.println(all);

2、关于TreeSet排序

可以使用自定义类作为保存数进行排序,但是一定要实现Comparable接口,以作为排序的依据。而在实现Comparable接口时,需要将所有属性参与到比较中,具体查看下面的compareTo方法,若只写return this.age-o.age,则运行输出,发现只有张三和赵五,年龄相同李四没有了。


  
  1. Set<Person> all = new TreeSet<Person>();
  2. all.add(new Person("张三",10));
  3. all.add(new Person("赵五",12));
  4. all.add(new Person("李四",10));
  5. all.add(new Person("赵五",12));
  6. System.out.println(all);
  7. class Person implements Comparable<Person>{
  8. private String name;
  9. private int age;
  10. public Person(String name,int age){
  11. this.name = name;
  12. this.age = age;
  13. }
  14. @Override
  15. public String toString() {
  16. return "Person{" +
  17. "name='" + name + '\'' +
  18. ", age=" + age +
  19. '}' ;
  20. }
  21. @Override
  22. public int compareTo(Person o) {
  23. if(this.age > o.age){
  24. return 1;
  25. }else if(this.age < o.age){
  26. return -1;
  27. }else{
  28. return this.name.compareTo(o.name);
  29. }
  30. }
  31. public String getName() {
  32. return name;
  33. }
  34. public void setName(String name) {
  35. this.name = name;
  36. }
  37. public int getAge() {
  38. return age;
  39. }
  40. public void setAge(int age) {
  41. this.age = age;
  42. }
  43. }

只要Java中牵扯到一组对象的排序操作,永远要使用Comparable接口完成,上例中可以看出,使用TreeSet进行排序,需要将所有属性参与到比较中,比较麻烦,所以一般很少用TreeSet进行比较操作,多用HashSet。

3、关于重复元素

Comparable只是适合于TreeXX类型的集合消除重复元素,而真正意义的重复判断不是利用Comparable接口完成,而是利用Object类的两个方法完成:

  • 取得对象的hash码:public int hashCode();
  • 对象比较:public boolean equals(Object obj);

  
  1. Set<Person> all = new HashSet<>();
  2. all.add(new Person("张三",10));
  3. all.add(new Person("赵五",12));
  4. all.add(new Person("李四",10));
  5. all.add(new Person("赵五",12));
  6. System.out.println(all);
  7. class Person{
  8. private String name;
  9. private int age;
  10. public Person(String name,int age){
  11. this.name = name;
  12. this.age = age;
  13. }
  14. @Override
  15. public String toString() {
  16. return "Person{" +
  17. "name='" + name + '\'' +
  18. ", age=" + age +
  19. '}' ;
  20. }
  21. @Override
  22. public boolean equals(Object o) {
  23. if (this == o) return true;
  24. if (o == null || getClass() != o.getClass()) return false;
  25. Person person = (Person) o;
  26. return age == person.age &&
  27. name.equals(person.name);
  28. }
  29. @Override
  30. public int hashCode() {
  31. return Objects.hash(name, age);
  32. }
  33. public String getName() {
  34. return name;
  35. }
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39. public int getAge() {
  40. return age;
  41. }
  42. public void setAge(int age) {
  43. this.age = age;
  44. }
  45. }

4、小结

1)Set接口重复数据消除依靠的是子类实现,HashSet基于hashCode()、equals(),TreeSet基于Comparable接口。

2)开发中很少用TreeSet,基本用的是HashSet。

 

作于202003061510,已归档

———————————————————————————————————

本文为博主原创文章,转载请注明出处!

若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!

祝君升职加薪,鹏程万里!

文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。

原文链接:winter.blog.csdn.net/article/details/104696425

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。