java 单列集合Set 万字详解

举报
Cyan_RA9 发表于 2023/05/04 15:58:14 2023/05/04
【摘要】 java 集合篇章——set集合总结。

目录

一、前言

二、Set集合总览

        1.概述 : 

        2.特点 : 

        3.Set集合的常用方法 : 

三、Set接口常用实现类详解

        1.HashSet源码分析(非常详细)

        2.LinkedHashSet源码分析(通俗易懂)

        3.TreeSet源码分析

四、完结撒❀


一、前言

        回忆一下我们的集合框架体系图。Set接口属于单列集合Collection接口下的另一条分支,它最常用的两个实现类分别是——HashSet和TreeSet。其中HashSet的底层其实就是HashMap,TreeSet的底层其实就是TreeMap,可见Set集合虽然作为单列集合Collection下的分支,但其本身却和Map集合有着千丝万缕的关系。

        本篇博文将带大家把Set接口的几个常用实现类逐个解析一遍,包括它们的详细底层实现和源码分析,并且,除了up上面提到的两个实现类,up还会给大家讲讲HashSet的一个子类——LinkedHashSet。

        注意 : 代码中的注释也很重要;不要眼高手低,自己跟着过一遍才算有收获;点击文章的侧边栏目录或者文章开头的目录可以进行跳转。良工不示人以朴,所有文章都会适时补充完善。大家如果有问题都可以在评论区进行交流或者私信up。感谢阅读!


二、Set集合总览

        1.概述 : 

        Set集合属于java.base模块,java.util包下,是单列集合Collection接口的另一个子接口。因为Set集合属于单列集合Collection系列,因此Set集合可以使用增强for和迭代器来遍历。但是同List接口相异的是,由于Set集合没有索引,因此传统的for循环无法遍历Set集合

        Set集合体系类图如下 : 

        2.特点 : 

        1.无序性Set集合是无序的,即元素的存取顺序是不一致的。因为Set集合没有索引,无法通过索引来访问Set集合中的元素

        PS : 

        虽然Set集合取出元素和存入元素时的顺序不一致,但是依赖于Set集合的底层算法,元素在取出时的顺序是固定的,不管你取出多少次。即输出Set集合时,元素在集合中的排列顺序是固定的。

        2.不可重复性。Set集合中的元素不可重复,因此,最多包含一个null。

        Δ演示 : 

        up以Intro类为演示类,利用多态的方法创建Set接口的实现类——HashSet类的对象

        Intro类代码如下 : 

package csdn.knowledge.api_tools.gather.set;
import java.util.HashSet;
import java.util.Set;
/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class Intro {
    public static void main(String[] args) {
        Set hashSet = new HashSet();
        hashSet.add(11);
        hashSet.add(11);
        hashSet.add(11);
        hashSet.add(985);
        hashSet.add(141);
        hashSet.add("Cyan_RA9");
        hashSet.add(null);
        hashSet.add(null);
        hashSet.add("CSDN yyds!");
        System.out.println(hashSet);
    }
}

image.gif

        运行结果 : 



        通过输出结果可以看到——

       对于相同的元素,不管添加几次,最后Set集合中只有一个该元素,可证Set集合的不可重复性。

        元素的输出顺序与存入的顺序不一致,可证Set集合的无序性。         

        3.Set集合的常用方法 : 

        up以Set_methods类为演示类,代码如下

package csdn.knowledge.api_tools.gather.set;
import java.util.HashSet;
import java.util.Set;
/**
 * @author : Cyan_RA9
 * @version : 21.0
 */
public class Set_methods {
    public static void main(String[] args) {
    //演示 : Set类的常用成员方法
        //创建HashSet类对象
            Set set = new HashSet();
        //1.boolean add(E e) —— 向集合中添加元素。
            set.add(11);
            set.add(5);
            set.add("Cyan");
            set.add(141);
            System.out.println("添加元素后,set = " + set);
            System.out.println("-----------------------------------------");
        //2.void clear() —— 清空当前集合
            set.clear();
            System.out.println("清空集合后,set = " + set);
            System.out.println("-----------------------------------------");
        //3.boolean contains(Object o) —— 判断当前集合中是否含有指定的元素
            System.out.println("当前集合中有141元素吗?" + set.contains(141));
            set.add(141);
            System.out.println("当前集合中有141元素吗?" + set.contains(141));
            System.out.println("-----------------------------------------");
        //4.boolean isEmpty() —— 判断当前集合是否为空
            set.clear();
            System.out.println("清空集合后,集合为空吗?" + set.isEmpty());
            set.add(141);
            set.add(11);
            set.add("CSDN NB");
            set.add(5);
            set.add("Cyan");
            System.out.println("添加元素后,集合为空吗?" + set.isEmpty());
            System.out.println("-----------------------------------------");
        //5.static Set of(......) —— 返回一个包含传入实参的新集合对象
            Set set2 = Set.of(0, 222, 2112, 2, 32, 11, "haha");
            Set set3 = Set.of(1, 2, 3, 4, 6);
            System.out.println("新集合set2 = " + set2);
            System.out.println("新集合set3 = " + set3);
            System.out.println("-----------------------------------------");
        //6.boolean remove(Object o) —— 删除Set集合中指定的元素
            System.out.println("当前集合set = " + set);
            set.remove(141);
            set.remove("Cyan");
            System.out.println("删除两个指定元素后,当前集合set = " + set);
            System.out.println("-----------------------------------------");
        //7.int size() —— 返回当前Set集合中元素的个数
            int capacity = set.size();
            System.out.println("当前集合中元素的个数为:" + capacity);
            System.out.println("-----------------------------------------");
        //8.Object[] toArray() —— 将当前集合转化为数组
            Object[] objects = set.toArray();
            System.out.print("遍历set集合转化为的数组:");
            for (Object object : objects) {
                System.out.print(object + "\t");
            }
    }
}

image.gif

        运行结果 : 

image.pngimage.png


三、Set接口常用实现类详解

        1.HashSet源码分析(非常详细)

                链接如下 : 

imagehttps://blog.csdn.net/TYRA9/article/details/129617532?spm=1001.2014.3001.5501

                HashSet类主要内容包括 : 

                ①HashSet简介

                ②HashSet的底层实现

                ③HashSet的源码解读(超详细)

        2.LinkedHashSet源码分析(通俗易懂)

                链接如下 :

image  https://blog.csdn.net/TYRA9/article/details/129719273?spm=1001.2014.3001.5502

              LinkedHashSet类主要内容包括 : 

                ①LinkedHashSet简介

                ②LinkedHashSet的底层实现

                ③LinkedHashSet的源码分析


        3.TreeSet源码分析

                链接如下 : 
  imagehttps://blog.csdn.net/TYRA9/article/details/129906619?spm=1001.2014.3001.5501           

TreeSet类主要内容包括 : 

                ①TreeSet类简介

                ②TreeSet类的底层实现

                ③TreeMap类简介

                ④TreeMap类的底层实现


四、完结撒❀

        🆗,以上就是Set集合的全部内容,其实我们讲Set,就是在讲它的实现类。所以重点内容就是Set接口的几个常用实现类的源码分析,尤其是HashSet类的源码分析,up感觉自己已经是讲得很详细了。好的,Set集合的旅程暂时告一段落,下一个系列是我们的双列集合——Map,大家不见不散。感谢阅读!

        System.out.println("END----------------------------------------------------------------------------"); 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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