Java集合框架(set篇)

本文涉及的产品
应用实时监控服务-用户体验监控,每月100OCU免费额度
函数计算FC,每月15万CU 3个月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: set集合的特点:set集合的遍历不像集合遍历一样是三种遍历方式了,而是两种:我们为什么要去重,因为如果是添加一个普通的一个元素的话set集合本身是可以去重的,但是如果你是添加一个对象的话他就不能去重了,为什么?因为每个对象他不是同一个地址,所以不能去重,再最后在工作的时候会用别人写的set集合的方法,你不可能叫别人去写,所以是需要自己去写的,所以才需要写set集合的去重。例如,我们可以创建一个HashSet对象用于去重,然后将多个元素添加进去:最终的Set中只包含3个元素,分别是"apple"、“ban

一、Set集合概述

Set是Java中的集合框架之一,用来存储一系列的元素。和List不同,Set中的元素不能重复,每个元素是唯一的。

Set有多个实现类,其中最常见的是HashSet和TreeSet。HashSet底层是使用HashMap实现的,而TreeSet则是使用红黑树实现的。HashSet的操作速度比较,但其元素是无序的;而TreeSet的元素是有序的,但操作速度相对较

Set的常用方法包括add()用来添加元素、remove()用来删除元素、contains()用来判断是否包含某个元素、isEmpty()用来判断集合是否为空、size()用来获取集合中元素的数量等等。

Set是一个很常用的集合框架,常用于需要存储不重复元素的场景中,如去除重复结果、判断两个集合是否相同等等。

在这里插入图片描述

二、Set集合特点

set集合的特点:

  1. 无序 没有修改方法
  2. 不可重复
    由以下代码可以看出:在这里插入图片描述

三、Set集合的遍历

set集合的遍历不像list集合遍历一样是三种遍历方式了,而是两种:

  1. foreach
  2. 迭代器(iterator)

    1、foreach

    在这里插入图片描述

2、iterator

在这里插入图片描述

四、set集合的去重

Set集合中的元素不能重复,这就天然地保证了去重的功能。当我们将多个元素添加到Set中时,如果Set中已经存在相同的元素,那么后续添加的相同元素会被自动忽略。

我们为什么要去重,因为如果是添加一个普通的一个元素的话set集合本身是可以去重的,但是如果你是添加一个对象的话他就不能去重了,为什么?因为每个对象他不是同一个地址,所以不能去重,再最后在工作的时候会用别人写的set集合的方法,你不可能叫别人去写,所以是需要自己去写的,所以才需要写set集合的去重。

例如,我们可以创建一个HashSet对象用于去重,然后将多个元素添加进去:

Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("cherry");
set.add("apple");
AI 代码解读

最终的Set中只包含3个元素,分别是"apple"、"banana"和"cherry",而第二个"apple"因为是重复的所以被忽略了。

需要注意的是,元素的去重是基于equals()方法和hashCode()方法来进行的,如果某个类没有重写这两个方法,不能保证元素能够被正确去重。因此,在创建自己的类并将其存储在Set集合中时,需要注意它的equals()方法和hashCode()方法是否正确实现。

1、元素的去重

Set<Integer> set = new TreeSet<>();
set.add(3);
set.add(1);
set.add(2);

Iterator<Integer> it = set.iterator();
while (it.hasNext()) {
   
   
    System.out.println(it.next());
}
AI 代码解读

以上代码会输出1、2、3,表示TreeSet中的元素已经按照升序排序。
输出的结果如下面的一样:
在这里插入图片描述

需要注意的是,在使用SortedSet和TreeSet时,元素的排序是基于比较器的,因此需要保证比较器的正确性。另外,在使用TreeSet时,由于它是基于红黑树实现的,所以访问元素的效率比较高。

2、对象的去重

如果是没有进行任何操作就会出现以下的情况:
在这里插入图片描述
【重点】

如前面我所说的要去重,是基于equals方法和hashCode方法

五、set集合的排序

Set集合本身的特点是无序的,即元素的顺序无法保证。如果需要按照某种顺序排序,可以使用SortedSet子接口或TreeSet实现类来实现。

SortedSet是Set接口的子接口,其中的元素可以按照自然顺序或指定顺序进行排序。具体来说,SortedSet要求其中元素必须实现Comparable接口或通过Comparator进行比较。

TreeSet是SortedSet接口的实现类,它是一个基于红黑树的集合,能够保证元素有序。TreeSet提供了多个构造方法,可以用于指定元素的比较器。

例如,我们可以创建一个TreeSet对象,然后将多个元素添加进去,最后通过迭代器进行遍历:

1、自然排序接口(Comparable)

需要我们的类implements Comparable接口:

Comparable是Java中的一个接口,用于比较类的对象的大小关系。它只包含一个方法compareTo(),用于比较两个对象之间的大小关系。

在实现了Comparable接口的类中,我们可以使用compareTo()方法来对对象进行排序和查找操作。此方法返回一个整数值,表示本对象与另一个对象的大小关系。若返回值为0,则表示两个对象相等;若返回值小于0,则表示本对象小于另一个对象;若返回值大于0,则表示本对象大于另一个对象。

例如,我们可以创建一个类Address,实现Comparable接口,然后在其中重写compareTo()方法:
在这里插入图片描述

对象的


/**
 * 
 * @author tgq
 *
 */
class Person implements Comparable<Person>{
   
   
    private int id;
    private String name;
    private int money;

    public Person(int id, String name, int money) {
   
   
        super();
        this.id = id;
        this.name = name;
        this.money = money;
    }

    @Override
    public int compareTo(Person o) {
   
   
        // 升序
        return this.id - o.id;
        // 降序
        return  o.id - this.id;
    }

}
AI 代码解读

以上代码中,我们对Address类的对象按照city和street进行比较。首先按照city进行比较,如果两个对象的city相等,则按照street进行比较。这样,在使用排序方法对Address类的对象进行排序时,就会按照city和street进行排序。

需要注意的是,使用Comparable接口进行排序时,需要保证被排序的元素类实现了该接口,并且该接口的实现比较器具有可传递性,即如果a > b并且b > c,则a > c。这样可以确保排序的正确性。

2、比较器排序接口(comparator)

Comparator是Java中的一个接口,用于比较类的对象的大小关系。与Comparable不同的是,Comparator独立于被比较的类,可以定义多个比较器,并且可以在使用时动态指定比较器。

Comparator接口只包含一个方法compare(),用于比较两个对象之间的大小关系。此方法返回一个整数值,表示第一个对象与第二个对象的大小关系。若返回值为0,则表示两个对象相等;若返回值小于0,则表示第一个对象小于第二个对象;若返回值大于0,则表示第一个对象大于第二个对象。

1、单个排序

例如,在我们上一个不变的情况下,然后在其中定义多个比较器:
在这里插入图片描述

2、多个排序

在原本的基础上做出一点点的改动

在这里插入图片描述

需要注意的是,在使用Comparator进行排序时,我们需要保证比较器具有可传递性,即如果a > b并且b > c,则a > c。这样可以确保排序的正确性。

希望对你们有用!!!

目录
打赏
0
1
1
0
11
分享
相关文章
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
66 3
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
27 2
|
1月前
|
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
187 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java常见的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口: 1. Collection接口的子接口包括:Set接口和List接口 2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等 3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
java 中的fork join框架
Java中的Fork Join框架于Java 7引入,旨在提升并行计算能力。它通过“分而治之”的思想,将大任务拆分为多个小任务(fork),再将结果合并(join)。核心组件包括:ForkJoinPool(管理线程池和工作窃取机制)、ForkJoinWorkerThread(执行具体任务的工作线程)和ForkJoinTask(定义任务逻辑,常用子类为RecursiveAction和RecursiveTask)。框架支持通过invoke、fork/join等方式提交任务,广泛应用于高性能并发场景。
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
Java中的Fork/Join框架详解
Fork/Join框架是Java并行计算的强大工具,尤其适用于需要将任务分解为子任务的场景。通过正确使用Fork/Join框架,可以显著提升应用程序的性能和响应速度。在实际应用中,应结合具体需求选择合适的任务拆分策略,以最大化并行计算的效率。
70 23
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
79 5
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
89 4
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
94 1

云原生

+关注