Java中的set集合是什么意思

 更新时间:2022年05月24日 14:15:34   作者:石原里美的微笑  
这篇文章主要介绍了Java中的set集合是什么意思,详细地讲解一下Collection集合中的另外一个分支——Set系列集合,需要的朋友可以参考下

引言

在前面的内容中,我们先是一一介绍了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中的set集合是什么意思的文章就介绍到这了,更多相关javaset集合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • macOS下Spring Boot开发环境搭建教程

    macOS下Spring Boot开发环境搭建教程

    这篇文章主要为大家详细介绍了macOS下Spring Boot开发环境搭建教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 通过JDK源码学习InputStream详解

    通过JDK源码学习InputStream详解

    InputStream抽象类是所有字节输入流的类的超类。这篇文章主要给大家介绍了关于通过JDK源码学习InputStream的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • Java中this,static,final,const用法详解

    Java中this,static,final,const用法详解

    这篇文章主要介绍了Java中this,static,final,const用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • spring的jdbctemplate的crud的基类dao

    spring的jdbctemplate的crud的基类dao

    本文主要介绍了使用spring的jdbctemplate进行增删改查的基类Dao的简单写法,需要的朋友可以参考下
    2014-02-02
  • springboot整合shiro登录失败次数限制功能的实现代码

    springboot整合shiro登录失败次数限制功能的实现代码

    这篇文章主要介绍了springboot整合shiro-登录失败次数限制功能,实现此功能如果是防止坏人多次尝试,破解密码的情况,所以要限制用户登录尝试次数,需要的朋友可以参考下
    2018-09-09
  • Java中的MarkerFilter的应用场景及使用示例详解

    Java中的MarkerFilter的应用场景及使用示例详解

    这篇文章主要介绍了Java中的MarkerFilter的应用场景及使用示例详解,使用log4j2,负责从消息队列收集日志的,现在系统收集到的日志能和这个系统本身的日志分开,需要的朋友可以参考下
    2024-01-01
  • Java多线程 原子操作类详细

    Java多线程 原子操作类详细

    这篇文章主要介绍了Java多线程中的原子操作类,原子的本意是不能被分割的粒子,而对于一个操作来说,如果它是不可被中断的一个或者一组操作,那么他就是原子操作。显然,原子操作是安全的,因为它不会被打断,需要的朋友可以参考下
    2021-10-10
  • Spring boot 整合RabbitMQ实现通过RabbitMQ进行项目的连接

    Spring boot 整合RabbitMQ实现通过RabbitMQ进行项目的连接

    RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,这篇文章主要介绍了Spring boot 整合RabbitMQ实现通过RabbitMQ进行项目的连接,需要的朋友可以参考下
    2022-10-10
  • 并发编程之Java内存模型顺序一致性

    并发编程之Java内存模型顺序一致性

    这篇文章主要介绍了并发编程Java内存模型顺序一致性,顺序一致性内存模型是一个理论参考模型,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照,下面我们一起进入文章看看学校内容,需要的朋友可以参考一下
    2021-11-11
  • SpringBoot整合Flyway的方法(数据库版本迁移工具)

    SpringBoot整合Flyway的方法(数据库版本迁移工具)

    这篇文章主要介绍了SpringBoot整合Flyway的方法(数据库版本迁移工具),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06

最新评论