• Set 集合概述与使用


    目录

    一、概述

    1.特点:

    2.方法:

    二、Set接口的使用

    三、Set实现类

    1.HashSet     ***

    (1)简单应用:

    (2)存储方式

    2.TreeSet

    (1)红黑树

     (2)使用

    (3)保存数据

    (4)Comparator接口


    一、概述

    1.特点:

    无序、无下标、元素不可重复。

    2.方法:

    全部继承自 Collection 中的方法。

    二、Set接口的使用

    1. import java.util.HashSet;
    2. import java.util.Iterator;
    3. import java.util.Set;
    4. /**
    5. * 测试Set接口的使用
    6. * 特点:无序 没有下标 不能重复
    7. */
    8. public class Test {
    9. public static void main(String[] args) {
    10. //创建集合
    11. Set set = new HashSet<>();
    12. //1.添加数据
    13. set.add("苹果");
    14. set.add("小米");
    15. set.add("Vivo");
    16. set.add("OPPO");
    17. System.out.println("数据个数:"+set.size());
    18. System.out.println(set.toString());
    19. System.out.println("-----------------------");
    20. //2.删除数据
    21. set.remove("Vivo");
    22. System.out.println(set.toString());
    23. System.out.println("-----------------------");
    24. //3.遍历
    25. //(1)增强for
    26. for (String string : set){
    27. System.out.println(string);
    28. }
    29. System.out.println("-----------------------");
    30. //(2)使用迭代器
    31. Iterator it = set.iterator();
    32. while (it.hasNext()){
    33. System.out.println(it.next());
    34. }
    35. System.out.println("-----------------------");
    36. //4.判断
    37. System.out.println(set.isEmpty());
    38. System.out.println(set.contains("OPPO"));
    39. }
    40. }

    三、Set实现类

    1.HashSet     ***

    基于HashCode实现元素不重复

    当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。

    (1)简单应用:

    ↓ ↓ ↓ ↓

    1. import java.util.HashSet;
    2. import java.util.Iterator;
    3. /**
    4. * HashSet集合的使用
    5. * 无序
    6. * 存储结构:哈希表 (数组+链表+红黑树)
    7. */
    8. public class Test {
    9. public static void main(String[] args) {
    10. //新建集合
    11. HashSet hashSet = new HashSet();
    12. //1.添加元素
    13. hashSet.add("E");
    14. hashSet.add("B");
    15. hashSet.add("C");
    16. hashSet.add("D");
    17. hashSet.add("E"); //出现重复的,最后也只会显示一个
    18. System.out.println("元素个数:"+hashSet.size());
    19. System.out.println(hashSet.toString());
    20. //2.删除数据
    21. hashSet.remove("E");
    22. System.out.println("删除之后:"+hashSet.size());
    23. System.out.println("-------------------");
    24. //3.遍历操作
    25. //(1)增强for循环
    26. for (String string : hashSet){
    27. System.out.println(string);
    28. }
    29. System.out.println("-------------------");
    30. //(2)迭代器
    31. Iterator it =hashSet.iterator();
    32. while(it.hasNext()){
    33. System.out.println(it.next());
    34. }
    35. System.out.println("-------------------");
    36. //4.判断
    37. System.out.println(hashSet.isEmpty());
    38. System.out.println(hashSet.contains("K"));
    39. }
    40. }


    (2)存储方式

    添加数据:

    Person p1= new Person("张三",22);
    Person p2= new Person("张",2);
    Person p3= new Person("三",12);
    Person p4= new Person("张 三",20);
    hashSet.add(p1);
    hashSet.add(p2);
    hashSet.add(p3);
    hashSet.add(p4);

    当添加数据 hashset.add(new Person("张三",22)); 时,数据仍会被添加进去。为什么呢?



    存储结构:哈希表(数组+链表+红黑树)

    存储过程:

    (1)根据hashcode计算保存位置,如果此位置为空,则直接保存,如果不为空执行第二步。

    (2)再执行equals方法,如果equals方法为true,则认为是重复;否则,形成链表。

     完整代码   重在注释    重在注释    重在注释

    ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 

    Person类:

    1. public class Person {
    2. private String name;
    3. private int age;
    4. public Person(String name, int age) {
    5. this.name = name;
    6. this.age = age;
    7. }
    8. public Person() {
    9. }
    10. public String getName() {
    11. return name;
    12. }
    13. public void setName(String name) {
    14. this.name = name;
    15. }
    16. public int getAge() {
    17. return age;
    18. }
    19. public void setAge(int age) {
    20. this.age = age;
    21. }
    22. @Override
    23. public String toString(){
    24. return "Person [name=" + name + ",age=" + age + "]";
    25. }
    26. @Override
    27. public int hashCode(){
    28. int n1 = this.name.hashCode();
    29. int n2 = this.age;
    30. return n1+n2;
    31. }
    32. @Override
    33. public boolean equals(Object obj){
    34. if(this==obj){
    35. return true;
    36. }if(obj==null){
    37. return false;
    38. }if (obj instanceof Person){
    39. Person p = (Person) obj;
    40. if (this.name.equals(p.getName())&&this.age==p.getAge());
    41. {
    42. return true;
    43. }
    44. }
    45. return false;
    46. }
    47. }

    Test测试类:

    1. import java.util.HashSet;
    2. import java.util.Iterator;
    3. /**
    4. * HashSet集合的使用
    5. * 无序
    6. * 存储结构:哈希表 (数组+链表+红黑树)
    7. */
    8. public class Test {
    9. public static void main(String[] args) {
    10. //新建集合
    11. HashSet hashSet = new HashSet<>();
    12. //1.添加数据
    13. Person p1= new Person("张三",22);
    14. Person p2= new Person("张",2);
    15. Person p3= new Person("三",12);
    16. Person p4= new Person("张 三",20);
    17. hashSet.add(p1);
    18. hashSet.add(p2);
    19. hashSet.add(p3);
    20. hashSet.add(p4);
    21. hashSet.add(new Person("张三",22));
    22. System.out.println("元素个数:" +hashSet.size());
    23. System.out.println(hashSet.toString());
    24. //2.删除数据
    25. hashSet.remove(p2);
    26. hashSet.remove(new Person("张三",22));//重写hashCode才能用这种方式删除
    27. System.out.println("删除之后:"+hashSet.size());
    28. System.out.println("-------------------");
    29. //3.遍历操作
    30. //(1)增强for循环
    31. for (Person person : hashSet){
    32. System.out.println(person);
    33. }
    34. System.out.println("-------------------");
    35. //(2)迭代器
    36. Iterator it =hashSet.iterator();
    37. while(it.hasNext()){
    38. System.out.println(it.next());
    39. }
    40. System.out.println("-------------------");
    41. //4.判断
    42. System.out.println(hashSet.isEmpty());
    43. System.out.println(hashSet.contains("K"));
    44. }
    45. }

    2.TreeSet

    基于排列顺序实现元素不重复。

    实现了SortedSet接口,对集合元素自动排列。

    元素对象的类型必须实现Compareable接口,指定排序规则。

    通过CompareTo方法确定是否为重复元素。

    (1)红黑树

    红黑树是在二叉树的基础上加了颜色。(保持平衡)

    二叉树:每个节点有两个分支,从上到下依次列出,数字大小  左小右大。

     (2)使用

    1. import java.util.Iterator;
    2. import java.util.TreeSet;
    3. /**
    4. * TreeSet的使用
    5. * 存储结构:红黑树
    6. */
    7. public class Test {
    8. public static void main(String[] args) {
    9. //创建集合
    10. TreeSet treeSet = new TreeSet<>();
    11. //1、添加元素
    12. treeSet.add("rgre");
    13. treeSet.add("esf");
    14. treeSet.add("rgewfgre");
    15. treeSet.add("rgrgre");
    16. System.out.println("元素个数:"+treeSet.size());
    17. System.out.println(treeSet.toString());
    18. System.out.println("--------------------------");
    19. //2.删除元素
    20. treeSet.remove("esf");
    21. System.out.println("删除之后的个数:" + treeSet.size());
    22. System.out.println("--------------------------");
    23. //3.遍历
    24. //(1)增强for
    25. for (String str : treeSet){
    26. System.out.println(str);
    27. }
    28. System.out.println("--------------------------");
    29. //(2)迭代器
    30. Iterator it = treeSet.iterator();
    31. while(it.hasNext()){
    32. System.out.println(it.next());
    33. }
    34. System.out.println("--------------------------");
    35. //4.判断
    36. System.out.println(treeSet.contains("wfef"));
    37. System.out.println(treeSet.isEmpty());
    38. }
    39. }

    (3)保存数据

     其他方法和HashCode一样。

    (4)Comparator接口

    import com.Demo02.Set.Person;
    import java.util.Comparator;
    import java.util.TreeSet;
    
    /**
     * TreeSet集合的使用
     * Comparator:实现定制比较(比较器)
     */
    
    public class TreeSet1 {
        public static void main(String[] args) {
            //创建集合,并制定比较规则
            TreeSet persons = new TreeSet<>(new Comparator() {
                @Override
                public int compare(Person o1, Person o2) {
                    int n1 = o1.getAge()-o2.getAge();
                    int n2 = o1.getName().compareTo(o2.getName());
                    return n1==0?n2:n1;
                }
            });
            Person p1 = new Person("ewfe",21);
            Person p2 = new Person("few",11);
            Person p3 = new Person("ewrvgfe",11);
            Person p4 = new Person("gtrh", 22);
    
            persons.add(p1);
            persons.add(p2);
            persons.add(p3);
            persons.add(p4);
            System.out.println(persons.toString());
    
        }
    }
    



    重在理解!!

    感谢ლ(°◕‵ƹ′◕ლ)!!!

  • 相关阅读:
    保姆级教程——VSCode如何在Mac上配置C++的运行环境
    C# 图解教程 第5版 —— 第15章 事件
    Docker 网桥、docker0 网桥和 --net host:平台差异、使用方式和场景介绍简介:
    目标检测DiffusionDet: Diffusion Model for Object Detection
    整合SSM(Mybatis-Spring-SpringMVC层)
    63. 不同路径 II java解决
    从C++CLI工程的依赖库引用问题看.Net加载程序集机制
    【ubuntu】中screen的安装与使用
    混淆电路简介(GC)
    再谈http请求调用(Post与Get),项目研发的核心一环
  • 原文地址:https://blog.csdn.net/yao_yaoya/article/details/128074435