java中的set集合如何理解——精简

石原里美的微笑      2022-05-23     770

关键词:

引言

在前面的内容中,我们先是一一介绍了Collection集合中都有哪些种类的集合,并且详细地讲解了List集合中的相关知识,那么今天我们来详细地讲解一下Collection集合中的另外一个分支——Set系列集合。最后还是希望这一篇篇的文章能够对你在集合中的学习、Java中的学习起到一定的帮助作用,好了,闲话不多说直接步入正题吧。

概念

Set系类集合特点:

  •  无序:存取顺序不一致
  • 不重复:可以去除重复
  • 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素

Set集合实现类特点:

HashSet:无序、不重复、无索引

LinkedHashSet:有序、不重复、无索引

TreeSet:排序、不重复、无索引

Set集合的功能上基本上与Collection的API一致。

 HashSet集合

HashSet集合:

Set<String> set = new HashSet<>();
        set.add("石原里美");
        set.add("石原里美");
        set.add("工藤静香");
        set.add("朱茵");
        System.out.println(set);
        set.remove("朱茵");
        System.out.println(set);

 输出结果:

 通过上述代码与运行结果,我们可以清晰地看出,HashSet集合无序、不重复的特性;

结合上述图片所示,可以看出HashSet集合是无法通过get()方法的索引获取数据的,并且在删除集合中的数据的时候,也只能通过定向的对数据进行删除。 

 LinkedHashSet集合:

LinkedHashSet集合:

Set<String> set = new LinkedHashSet<>();
        set.add("石原里美");
        set.add("石原里美");
        set.add("工藤静香");
        set.add("朱茵");
        System.out.println(set);
        set.remove("朱茵");
        System.out.println(set);

输出结果:

通过上述代码与输出结果做对比,即可看出无序与有序之间的区别,前者是会将传入的数据顺序打乱,而后者则是仍然按照输入数据的顺序存储数据,因此输出的时候是有序状态。 

TreeSet集合: 

TreeSet集合:

Set<Integer> set = new TreeSet<>();
        set.add(13);
        set.add(23);
        set.add(23);
        set.add(11);
        System.out.println(set);
        set.remove(23);
        System.out.println(set);

 输出结果:

 通过上述代码和输出结果我们便可以通过字面意思去理解为什么TreeSet的特点是排序了,即将存储的数据按照Java默认的排序方式进行排序。

然而此时若存储自定义如People对象,TreeSet无法直接排序,会出现报错的情况!

//People类:
public class People
    private String name;
    private int age;
    private String classroom;

    public People()

    
    public People(String name, int age, String classroom) 
        this.name = name;
        this.age = age;
        this.classroom = classroom;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    public String getClassroom() 
        return classroom;
    

    public void setClassroom(String classroom) 
        this.classroom = classroom;
    

    @Override
    public String toString() 
        return "People" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", classroom='" + classroom + '\'' +
                '';
    

//main方法:
public static void main(String[] args) 
        Set<People> p = new TreeSet<>();
        p.add(new People("张三",19,"智能"));
        p.add(new People("李四",18,"数据库"));
        p.add(new People("王五",20,"渗透"));
        System.out.println(p);
    

若想解决该问题,我们就需要为TreeSet集合自定义存储类型,现有两种方式可以解决该问题:一种是自定义类实现Comparable接口并重写里面的compareTo方法指定规则;另一种则是集合自带比较器对象进行规则定义。

方式一:自定义类实现Comparable接口重写里面的compareTo方法指定比较规则(多余无关紧要的代码在此不再赘述了,只展示重要的那部分代码)

//改变的第一个地方:实现Comparable类
public class People implements Comparable<People> 
//改变的第二个地方:重写Comparable类中的compareTo方法    
    @Override
    public int compareTo(People o) 
        return this.age-o.age;
    

输出结果(根据年龄进行比较): 

在重写的方法中,return后面的代码决定了该对象将要根据什么准则进行比较,比较规则如下:

  • 如果认为第一个元素大于第二个元素返回正整数即可
  • 如果认为第一个元素小于第二个元素返回负整数即可
  • 如果认为第一个元素等于第二个元素返回0即可,此时Treeset集合只会保留一个元素,认为两者重复

方式二:集合自带比较器对象进行规则定义

Set<People> p = new TreeSet<>(new Comparator<People>() 
            @Override
            public int compare(People o1, People o2) 
                return o1.getAge()-o2.getAge();
            
        );

在原来的基础之上对集合的创建作出改变,并且其比较准则与前面的定义方法类似,相对前面的方式,这种方式会更加方便快捷一些。在此,我们也可以回顾一些前面所学到的知识“Lambda表达式”,对给代码块进行化简。

Set<People> p = new TreeSet<>((o1, o2) -> o1.getAge()-o2.getAge());

如果没有学习过Lambda表达式,或者说是对Lambda表达式的知识不清晰,那么可以可以看Java中的lambda表达式如何理解——精简这篇文章的讲解,或许会对你有所帮助的。

实战场景 

  • 元素可以重复、又有索引、索引查询速度快

使用ArrayList集合,基于数组

  •  元素可以重复、又有索引、增删首尾操作快

使用LinkedList集合,基于链表

  • 增删查改快,但是元素不重复、无序、无索引

使用HashSet集合,基于哈希表

  • 增删查改快,但是元素不重复、有序、无索引

使用LinkedHashSet集合,基于哈希表和双链表

  • 需要对对象进行排序

使用TreeSet集合,基于红黑树,后续也可以使用List集合实现

创作不易,给个三连吧 

java中的多线程如何理解——精简(代码片段)

目录引言线程安全 实战模拟 线程同步 方式一:同步代码块 方式二:同步方法 方式三:Lock锁 线程池 线程池处理Runnable任务 线程池处理Callable任务 Executors的工具类构建线程池对象 引言    通过前面的学习&#x... 查看详情

java中的io流如何理解——精简(代码片段)

目录引言缓冲流 字节缓冲流 字符缓冲流 转换流 字符输入转换流 字符输出转换流 序列化和反序列化 对象序列化 对象反序列化 打印流 Properties 引言通过前面的简单学习,我们已经能够大致了解了关于文件的操作ÿ... 查看详情

java中的lambda表达式如何理解——精简(代码片段)

✌️✌️✌️在写之前,我在考虑是否要写这篇文章,然而当我查阅“lambda表达式”的相关内容的时候,我发现大量的文章都出现了冗余的现象,文章的篇幅过于夸张,严重影响了大家阅读的兴趣,因此我... 查看详情

《深入理解es6》之set集合与map集合

...含有一些相互独立的非重复,通过Set集合可以快速访问其中的数据,更有效地追踪各种离散值。创建Set集合并添加元素  调用newSet()创建Set集合,调用add()方法向集合添加元素,访问集合的size属性可以获取集合中目前的元素数... 查看详情

java中的set,list,map的区别

参考技术A  对JAVA的集合的理解是想对于数组  数组是大小固定的并且同一个数组只能存放类型一样的数据(基本类型/引用类型)  JAVA集合可以存储和操作数目不固定的一组数据  所有的JAVA集合都位于javautil包中! ... 查看详情

java零基础小白学习免费教程day14-set&hashmap(代码片段)

day14_JAVAOOP课程目标1.【理解】Set集合的特点2.【理解】Set集合不重复的原理3.【掌握】HaseSet集合的基本使用4.【理解】LinkedHashSet的特点5.【理解】Map集合的特点6.【掌握】HashMap的使用7.【理解】LinkedHashMap的特点8.【掌握】Map集合的... 查看详情

java零基础小白学习免费教程day14-set&hashmap(代码片段)

day14_JAVAOOP课程目标1.【理解】Set集合的特点2.【理解】Set集合不重复的原理3.【掌握】HaseSet集合的基本使用4.【理解】LinkedHashSet的特点5.【理解】Map集合的特点6.【掌握】HashMap的使用7.【理解】LinkedHashMap的特点8.【掌握】Map集合的... 查看详情

java集合框架要点概括(coreknowledgeofjavacollection)

目录有哪些集合类Set类Queue类List类Map类HashMap的实现原理,是否线程安全,如何使其做到线程安全HashMap的实现原理HashMap的线程安全问题本文主要参考:《疯狂Java讲义精简版》-李刚HashMap实现原理分析有哪些集合类一图终结Set,Que... 查看详情

day16java语言中的----set集合

day16java语言中的----set集合一、集合【collection】概述:    这里我们就开始学习一下set集合,我们就说三个集合,分别是set/list/map三种,他们都是接口,list和set集合都是collection主接口的子接口,map集合与主接口就... 查看详情

java中如何找出两个集合中的不重复的元素

循环第一个集合,在第二个集合中查找,就可以将第一个集合的数据分成,两类,1类是再第二个集合有的,一类是在第二个集合中没有的。这样,才把第二个集合中有的作为一个新集合,循环第二个集合的时候只需要对比就行... 查看详情

尚硅谷_java零基础教程(集合collection:list,set;map)--学习笔记(代码片段)

...合框架概述1.理解2.集合框架涉及到的API二、Collection接口中的方法三、Iterator迭代器接口1.理解2.主要方法3.foreach四、Collection子接口一:List接口1.概述2.List接口的常用实现类3.接口方法五、Collection子接口二:Set1.概述2.Set接... 查看详情

1125937650(代码片段)

...a核心编程技术(第二版)》中是这样介绍java集合的:java中的集合框架提供了一套设计优良的接口和类,使程序员操作成批的数据或对象元素极为方便。这些接口和类有很多对抽象数据类型操作的API,这是我们常用的且在数据结... 查看详情

java中的set集合

...List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,它是比Collection接口更加严格了。与List接口不同的是,Set接口元素无序,并且都会以某种规则保证存入的元素... 查看详情

java中list与set有啥区别?

...对象本身。Java集合主要分为三种类型:a.Set(集):集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类能对集合中的对象按特定方式排序。b.List(列表):集合中的对象按索引位置排序,可以有重复对象,允... 查看详情

java中的集合有几种

...的引用,而非对象本身,为了说起来方便些,我们称集合中的对象就是指集合中对象的引用(reference)。引用的概念大家不会忘了吧,在前边我们讲数据类型时讲的。集合类型主要有3种:set(集)、list(列表)、map(映射)和Queue(队... 查看详情

如何检查对象是不是是Java中的集合类型?

】如何检查对象是不是是Java中的集合类型?【英文标题】:HowtocheckifanObjectisaCollectionTypeinJava?如何检查对象是否是Java中的集合类型?【发布时间】:2011-02-0817:55:31【问题描述】:通过使用java反射,我们可以很容易地知道一个对... 查看详情

《深入理解java集合框架》系列文章

...板库(StandardTemplateLibrary,STL)的书籍和资料有很多,关于Java集合框架(JavaCollectionsFramework,JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦。我深深的不解其中的原因。虽然JCF设计参考了STL... 查看详情

在java中,set集合和list集合有啥相同点和不同点???

...你有所帮助Set(集合):  Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。  Set介面主要实现了两个实现类:  HashSet : HashSet类按照哈希演算法来存取集合中的对象,存取速度比较快... 查看详情