• Set集合详细讲解


    目录

    一.Set集合

    二.HashSet集合

     foreach循环遍历

    迭代器遍历数组  

    三.TreeSet集合


    一.Set集合

    Set集合其实就是一个接口,HashSet和TreeSet实现了Set接口,所有Set所具备的方法HashSet和TreeSet也是具备的。

    特点:

    • set集合是无序的,不重复的(无序的意思是不会按照我们增加进集合的顺序)
    • 遍历通过foreach,迭代器,无法通过下标,因为set集合没有下标
    • 初始容量为16,负载因子0.75倍,扩容量增加1倍 

       


    二.HashSet集合

    • HashSet是实现Set集合接口的,所以Set集合所具备的,它也具备。
    • 它只储存唯一元素并且允许为空值。储存唯一元素的意思是,如果你增加两个1,那么有一个1会被干掉,只有1一个1存在。
    • 由HashMap支持。
    • 不保持插入顺序
    • 线程不安全

     

    •  foreach循环遍历

         如果里面有的元素增加进去会被覆盖,大家可以按住Ctrl点击add进去看源码。源码里有一个boolean的方法,该方法是判断新增加的元素在该集合是否已经存在了,如果为false那么里面已经存在和该元素一样的元素,如果为true那么里面没有该元素,增加进该集合。

      注:如果已经有元素存在
            

    1. package com.yjx.test;
    2. import java.util.ArrayList;
    3. import java.util.HashSet;
    4. import java.util.List;
    5. import java.util.Set;
    6. import org.junit.Before;
    7. import org.junit.Test;
    8. public class Test01 {
    9. private Set<Integer> set=new HashSet<Integer>();
    10. @Before
    11. public void list() {
    12. set.add(1);
    13. set.add(1);
    14. set.add(2);
    15. set.add(3);
    16. set.add(3);
    17. set.add(4);
    18. set.add(5);
    19. set.add(6);
    20. }
    21. @Test
    22. public void test01() {
    23. for(Integer e:set) {
    24. System.out.println(e);
    25. }
    26. }
    27. }

      set集合增加的源码里的判断元素是否在集合中存在的方法

      

    boolean add(E e);

    得到结果:

      

    • 迭代器遍历数组  

         hasNext:判断集合中是否还有元素

    1. public void test02() {
    2. Iterator<Integer>it=set.iterator();
    3. while(it.hasNext()) {
    4. System.out.println(it.next());
    5. }
    6. }

      得到结果:

      

     

      

      我们创建一个学生实体类,然后将学生增加进集合。

    •   Stundet类一定要实现hashCode()和equals方法,因为他们用来对比两个对象是否相等一致
    • 大家可以试一下在stundet类中实现这两个方法,和去除这两个方法的区别,如果Studnet中没有这个方法,那么就算id和名字和年龄全相等,依旧可以增加进去

      Studnet类

    1. package com.yjx.test;
    2. public class Stundet {
    3. private Integer id;
    4. private String name;
    5. private Integer age;
    6. public Integer getId() {
    7. return id;
    8. }
    9. public void setId(Integer id) {
    10. this.id = id;
    11. }
    12. public String getName() {
    13. return name;
    14. }
    15. public void setName(String name) {
    16. this.name = name;
    17. }
    18. public Integer getAge() {
    19. return age;
    20. }
    21. public void setAge(Integer age) {
    22. this.age = age;
    23. }
    24. public Stundet() {
    25. // TODO Auto-generated constructor stub
    26. }
    27. public Stundet(Integer id, String name, Integer age) {
    28. super();
    29. this.id = id;
    30. this.name = name;
    31. this.age = age;
    32. }
    33. @Override
    34. public int hashCode() {
    35. final int prime = 31;
    36. int result = 1;
    37. result = prime * result + ((age == null) ? 0 : age.hashCode());
    38. result = prime * result + ((id == null) ? 0 : id.hashCode());
    39. result = prime * result + ((name == null) ? 0 : name.hashCode());
    40. return result;
    41. }
    42. @Override
    43. public boolean equals(Object obj) {
    44. if (this == obj)
    45. return true;
    46. if (obj == null)
    47. return false;
    48. if (getClass() != obj.getClass())
    49. return false;
    50. Stundet other = (Stundet) obj;
    51. if (age == null) {
    52. if (other.age != null)
    53. return false;
    54. } else if (!age.equals(other.age))
    55. return false;
    56. if (id == null) {
    57. if (other.id != null)
    58. return false;
    59. } else if (!id.equals(other.id))
    60. return false;
    61. if (name == null) {
    62. if (other.name != null)
    63. return false;
    64. } else if (!name.equals(other.name))
    65. return false;
    66. return true;
    67. }
    68. @Override
    69. public String toString() {
    70. return "Stundet [id=" + id + ", name=" + name + ", age=" + age + "]";
    71. }
    72. }

     方法

     像这种学生id和学生名字都相同,但是年龄不同,所以他们不是同一个人,两个都会增加进去的。

     

    1. public void test03() {
    2. //先创建一个集合
    3. Set<Stundet> set=new HashSet<Stundet>();
    4. set.add(new Stundet(1,"张三",18));
    5. set.add(new Stundet(1,"张三",19));
    6. set.add(new Stundet(3,"张五",16));
    7. set.add(new Stundet(5,"张六",11));
    8. set.add(new Stundet(3,"张七",12));
    9. for(Stundet s:set) {
    10. System.out.println(s);
    11. }
    12. }

     得到结果:

     

      

     但是如果我们将第一个和第二个将id和名字和年龄都设置为一样的,那么只有一个会增加进去。

       

    1. public void test03() {
    2. //先创建一个集合
    3. Set<Stundet> set=new HashSet<Stundet>();
    4. set.add(new Stundet(1,"张三",18));
    5. set.add(new Stundet(1,"张三",18));
    6. set.add(new Stundet(3,"张五",16));
    7. set.add(new Stundet(5,"张六",11));
    8. set.add(new Stundet(3,"张七",12));
    9. for(Stundet s:set) {
    10. System.out.println(s);
    11. }
    12. }

    得到结果:而且还会帮我们根据id进行一个排序

      

     如果我们想用根据年龄进行一个排序,这个时候就要用到TreeSet,接着往下看。

    三.TreeSet集合

    • 是一个包含有序的且没有重复元素的集合
    • 作用是提供有序的Set集合,自然排序或者根据提供的Comparator进行排序
    • TreeSet是基于TreeMap实现的

     什么使用TreeSet集合?

     当我们想根据什么进行排序的话就可以使用TreeSet集合,下面就教大家如何使用TreeSet集合进行排序。 

     

    •    第一种方法

          我们使用Comparator进行一个排序,可以从小到大,也可以从大到小,但是这种方法存在一个很大的问题,如果有年龄相同的,那么只会有一个留下,其他的就会不存在该集合中了。

      

    这个是从小到大排序的,想要从大到小,就o2.getAge-o1.getAge。

    1. public void test04() {
    2. TreeSet<Stundet> tree=new TreeSet<Stundet>(new Comparator<Stundet>() {
    3. @Override
    4. public int compare(Stundet o1, Stundet o2) {
    5. return o1.getAge() - o2.getAge();
    6. }
    7. });
    8. //先创建一个集合
    9. tree.add(new Stundet(1,"张三",18));
    10. tree.add(new Stundet(3,"张五",16));
    11. tree.add(new Stundet(5,"张六",18));
    12. tree.add(new Stundet(4,"张七",12));
    13. tree.add(new Stundet(6,"张七",12));
    14. for(Stundet s:tree) {
    15. System.out.println(s);
    16. }
    17. }

         得到结果:

        

      

       刚刚我们也说了,出现年龄相同,只会留下一个,那么这种方法该如何解决嘞,大家看下面代码。

     我们增加了一个判断,当年龄相减为0,他们相等,那就根据他们的id进行排序。就可以解决这样子的问题啦。

    1. public void test04() {
    2. TreeSet<Stundet> tree=new TreeSet<Stundet>(new Comparator<Stundet>() {
    3. @Override
    4. public int compare(Stundet o1, Stundet o2) {
    5. if(o1.getAge() - o2.getAge()==0) {
    6. return o1.getId()-o2.getId();
    7. }
    8. return o1.getAge() - o2.getAge();
    9. }
    10. });
    11. //先创建一个集合
    12. tree.add(new Stundet(1,"张三",18));
    13. tree.add(new Stundet(3,"张五",16));
    14. tree.add(new Stundet(5,"张六",18));
    15. tree.add(new Stundet(4,"张七",12));
    16. tree.add(new Stundet(6,"张七",12));
    17. for(Stundet s:tree) {
    18. System.out.println(s);
    19. }
    20. }

        得到结果:所有的数据都存在,id根据从小到大的顺序。

        

       

         

    •      第二种方法

       我们在Studnet实体类中做判断,实现Comparable

    1. package com.yjx.test;
    2. import java.util.Comparator;
    3. public class Stundet implements Comparable<Stundet>{
    4. private Integer id;
    5. private String name;
    6. private Integer age;
    7. public Integer getId() {
    8. return id;
    9. }
    10. public void setId(Integer id) {
    11. this.id = id;
    12. }
    13. public String getName() {
    14. return name;
    15. }
    16. public void setName(String name) {
    17. this.name = name;
    18. }
    19. public Integer getAge() {
    20. return age;
    21. }
    22. public void setAge(Integer age) {
    23. this.age = age;
    24. }
    25. public Stundet() {
    26. // TODO Auto-generated constructor stub
    27. }
    28. public Stundet(Integer id, String name, Integer age) {
    29. super();
    30. this.id = id;
    31. this.name = name;
    32. this.age = age;
    33. }
    34. @Override
    35. public int hashCode() {
    36. final int prime = 31;
    37. int result = 1;
    38. result = prime * result + ((age == null) ? 0 : age.hashCode());
    39. result = prime * result + ((id == null) ? 0 : id.hashCode());
    40. result = prime * result + ((name == null) ? 0 : name.hashCode());
    41. return result;
    42. }
    43. @Override
    44. public boolean equals(Object obj) {
    45. if (this == obj)
    46. return true;
    47. if (obj == null)
    48. return false;
    49. if (getClass() != obj.getClass())
    50. return false;
    51. Stundet other = (Stundet) obj;
    52. if (age == null) {
    53. if (other.age != null)
    54. return false;
    55. } else if (!age.equals(other.age))
    56. return false;
    57. if (id == null) {
    58. if (other.id != null)
    59. return false;
    60. } else if (!id.equals(other.id))
    61. return false;
    62. if (name == null) {
    63. if (other.name != null)
    64. return false;
    65. } else if (!name.equals(other.name))
    66. return false;
    67. return true;
    68. }
    69. @Override
    70. public String toString() {
    71. return "Stundet [id=" + id + ", name=" + name + ", age=" + age + "]";
    72. }
    73. @Override
    74. public int compareTo(Stundet o) {
    75. if(o.getAge()-this.getAge()==0) {
    76. return o.getId()-this.getId();
    77. }
    78. return o.getAge()-this.getAge();
    79. }
    80. }

     测试方法代码

    1. @Test
    2. public void test05() {
    3. TreeSet<Stundet> tree=new TreeSet<Stundet>();
    4. //先创建一个集合
    5. tree.add(new Stundet(1,"张三",18));
    6. tree.add(new Stundet(3,"张五",16));
    7. tree.add(new Stundet(5,"张六",18));
    8. tree.add(new Stundet(4,"张七",12));
    9. tree.add(new Stundet(6,"张七",12));
    10. for(Stundet s:tree) {
    11. System.out.println(s);
    12. }
    13. }

     这种方法也是可以的噢,大家最好做个判断,避免出现一样大的数据而只留下一个这种情况。 

    今天的学习就到这里啦。 

  • 相关阅读:
    JavaScript Web APIs第一天笔记
    C++初阶-类和对象(中)1
    mysql 事务的实用小实例
    C# 32应用程序获取64位操作系统注册表
    html实现9*9乘法表
    低代码助力疫情防控:综合管理系统模板
    LDR6328Q,快充界的黑马
    基于CNTK/C#实现逻辑回归【附源码】
    Java : 类加载和双亲委派模型
    MindSpore导入CUDA算子
  • 原文地址:https://blog.csdn.net/m0_65725031/article/details/125505266