Java Set基础篇

news2025/6/23 5:06:40

目录

  • 前言
  • 一、常用Set
    • 1.1 Set
      • 1.1.1 特点
    • 1.2 HashSet
      • 1.2.1 特点
      • 1.2.2 使用
    • 1.3 TreeSet
      • 1.3.1 特点
      • 1.3.2 使用
    • 1.4 LinkedHashSet
      • 1.4.1 特点
      • 1.4.2 使用
  • 二、对比总结


目录

前言

一、常用Set

1.1 Set

Set是一个继承自Collection的接口:

public interface Set<E> extends Collection<E> {

Set接口包含Collection接口的所有方法。

api作用描述
add()将指定的元素添加到集合中
addAll()将指定集合的所有元素添加到集合中
iterator()返回一个迭代器,该迭代器可用于顺序访问集合中的元素
remove()从集合中移除指定的元素
removeAll()从存在于另一个指定集合中的集合中删除所有元素
keepAll()保留集合中所有还存在于另一个指定集合中的所有元素
clear()从集合中删除所有元素
size()返回集合的长度(元素数)
toArray()返回包含集合中所有元素的数组
contains()如果集合包含指定的元素,则返回true
containsAll()如果集合包含指定集合的所有元素,则返回true
hashCode()返回哈希码值(集合中元素的地址)

Set集合的实现类主要为HashSet、TreeSet、LinkedHashSet等。

1.1.1 特点

Set集合的特点是:

不允许重复元素。
不保证元素的顺序,取决于具体实现类。
基于哈希表或红黑树等数据结构实现。

1.2 HashSet

HashSet是基于哈希表实现的Set集合,不允许重复元素。它通过哈希算法将元素存储在内部的哈希表中,提供了快速的查找和插入操作。

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

1.2.1 特点

HashSet的特点

不允许重复元素。
不保证元素的顺序,取决于哈希算法和具体实现。
具有常数时间复杂度(O(1))的查找、插入和删除操作。
适用于需要快速查找元素且不关心顺序的场景。
内部使用HashMap实现,元素存储在键的位置,值为一个静态的Object对象。

1.2.2 使用

    public static void main(String[] args) {
        //使用HashSet类创建集合
        Set<Integer> set1 = new HashSet<>();

        //将元素添加到set1
        set1.add(2);
        set1.add(3);
        System.out.println("Set1: " + set1);

        //使用HashSet类创建另一个集合
        Set<Integer> set2 = new HashSet<>();

        //添加元素
        set2.add(1);
        set2.add(2);
        System.out.println("Set2: " + set2);

        //两个集合的并集
        set2.addAll(set1);
        System.out.println("并集是: " + set2);
    }

输出:
在这里插入图片描述

1.3 TreeSet

TreeSet是基于红黑树实现的Set集合,可以按照元素的自然顺序或自定义顺序进行排序。它提供了有序的遍历能力,支持高效的插入、删除和查找操作。

public class TreeSet<E> extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable

1.3.1 特点

TreeSet的特点:

元素按照自然顺序或自定义顺序排序。
提供有序的遍历能力。
查找、插入和删除操作的时间复杂度为O(log n)。
适用于需要有序访问元素的场景。

1.3.2 使用

    public static void main(String[] args) {
        //使用TreeSet类创建集合
        Set<Integer> numbers = new TreeSet<>();

        // 将元素添加到set集合
        numbers.add(2);
        numbers.add(3);
        numbers.add(1);
        System.out.println("TreeSet: " + numbers);

        //使用iterator()访问元素
        System.out.print("使用iterator()访问元素: ");
        Iterator<Integer> iterate = numbers.iterator();
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }

输出:可以看到TreeSet对元素进行了排序
在这里插入图片描述

1.4 LinkedHashSet

LinkedHashSet是HashSet的子类,它在HashSet的基础上通过双向链表维护了元素的插入顺序,因此可以保持元素的插入顺序。在需要保持元素插入顺序的场景,同时又需要HashSet的快速查找特性的情况下,使用LinkedHashSet是一个不错的选择。

public class LinkedHashSet<E>
    extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {

1.4.1 特点

LinkedHashSet的特点:

保持插入顺序或访问顺序。
继承了HashSet的查找效率。
具有HashSet的不允许重复元素的特性。
适用于需要保持元素插入顺序的场景。

1.4.2 使用

//具有8个容量和0.75负载因子的LinkedHashSet
LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75);

capacity - 该哈希集的容量为8。意味着,它可以存储8个元素。
此哈希集的负载因子为0.75。这意味着,只要我们的哈希表填充了75%,元素就会移动到新哈希表中,该哈希表的大小是原始哈希表的两倍。

并集demo

    public static void test1() {
        LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("LinkedHashSet1: " + evenNumbers);

        LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
        numbers.add(1);
        numbers.add(3);
        System.out.println("LinkedHashSet2: " + numbers);

        //两个集合的并集
        numbers.addAll(evenNumbers);
        System.out.println("并集: " + numbers);
    }

输出:
在这里插入图片描述
交集demo

 public static void test2() {
        LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
        primeNumbers.add(2);
        primeNumbers.add(3);
        System.out.println("LinkedHashSet1: " + primeNumbers);

        LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("LinkedHashSet2: " + evenNumbers);

        //集合的交集
        evenNumbers.retainAll(primeNumbers);
        System.out.println("集合的交集: " + evenNumbers);
    }

输出
在这里插入图片描述

LinkedHashSet常用API:

api作用描述
boolean add(E e)向集合中添加指定元素。
void addAll(Collection<? extends E> c)将指定集合中的所有元素添加到集合中。
boolean remove(Object o)从集合中删除指定元素。
void clear()清空集合中的所有元素。
boolean contains(Object o)判断集合中是否包含指定元素。
boolean isEmpty()判断集合是否为空。
int size()返回集合中元素的个数。
Iterator iterator()返回一个迭代器,用于遍历集合中的元素。
forEach(Consumer<? super E> action)对集合中的每个元素执行指定操作。
void clear()清空集合中的所有元素。
Object clone()复制集合。
boolean retainAll(Collection<?> c)仅保留集合中包含在指定集合中的元素。

LinkedHashSet与HashSet的区别

LinkedHashSet在内部维护一个链表。因此,它保持其元素的插入顺序。
LinkedHashSet类比HashSet需要更多的存储空间。这是因为LinkedHashSet在内部维护链表。
LinkedHashSet的性能比HashSet慢。这是因为LinkedHashSet中存在链表。

LinkedHashSet 与TreeSet的区别

TreeSet类实现了SortedSet接口。这就是为什么树集中的元素是有序的。但是,LinkedHashSet类只维护其元素的插入顺序。
TreeSet通常比LinkedHashSet慢。这是因为每当将元素添加到TreeSet时,它都必须执行排序操作。
LinkedHashSet允许插入空值。但是不能向TreeSet插入空值。

二、对比总结

Set特点适用场景
HashSet基于哈希表实现,不保证元素的顺序。适用于需要快速查找元素且不关心顺序的场景。
TreeSet基于红黑树实现,元素按照自然顺序或自定义顺序排序。适用于需要有序访问元素的场景,提供了有序的遍历能力。
LinkedHashSet基于哈希表和双向链表实现,保持插入顺序或访问顺序。适用于需要保持插入顺序或访问顺序的场景,提供了可以预测的迭代顺序。

参考链接:
Java LinkedHashSet
Java Set 接口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1584608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 用管道实现一个简易版的进程池

概念 进程池其实就是我们提前创建好一批进程&#xff0c; 当有任务的时候再将进程指派过去完成那个任务。 中间的这框框就是管道&#xff0c; 当父进程没有给子进程发送任务的时候&#xff0c; 子进程就会一直阻塞着&#xff0c; 于是就形成了这样的结构。 代码 #include &q…

如何在 YouTube、Medium、Twitter 和 Linkedin 上使用 ChatGPT 赚钱

人工智能SEO&#xff1a;未来内容优化的革命 介绍 在当今的数字时代&#xff0c;利用 ChatGPT 等人工智能工具已经成为在线内容创建和货币化领域的游戏规则改变者。 本指南探讨了如何在 YouTube、Medium、Twitter 和 Linkedin 等各种平台上有效使用 ChatGPT&#xff0c;不仅可以…

c 解数独(通用方法,适用于9×9 数独)

折腾了一周时间&#xff0c;终于搞定99数独通用方法 思路&#xff1a;1.生成每行空位的值&#xff0c;也就是1-9中除去非0的数。 2.用行&#xff0c;列&#xff0c;宫判断每行中每个空位的最小取值范围后再重新生成每行。 3.随机提取生成的9行&#xff0c;判断每列之和是否等…

SolidWorks Electrical图层管理器

SolidWorks Electrical中的图层是用来管理和控制不同类型的图形对象的显示和隐藏的工具。图层可以帮助用户更好地组织和管理电气设计中的不同元素&#xff0c;提高设计效率和可视化效果。 在SolidWorks Electrical中&#xff0c;用户可以创建多个图层&#xff0c;并为每个图层…

【C 数据结构】顺序表

文章目录 【 1. 基本原理 】【 2. 顺序表的初始化 】【 3. 顺序表 插入元素 】【 4. 顺序表 删除元素 】【 5. 顺序表 查找元素 】【 6. 顺序表 更改元素值 】【 7. 实例 】 【 1. 基本原理 】 顺序表&#xff0c;全名顺序存储结构&#xff0c;是线性表的一种。顺序表对数据的…

openssl3.2 - exp - zlib

文章目录 openssl3.2 - exp - zlib概述笔记命令行实现程序实现备注 - 压缩时无法base64压缩时无法带口令压缩实现 - 对buffer进行压缩和解压缩测试效果工程实现main.cppCOsslZlibBuffer.hCOsslZlibBuffer.cpp总结END openssl3.2 - exp - zlib 概述 客户端和服务端进行数据交换…

无人机低空数字摄影测量系统

一、 系统概述 系统完全基于IDL设计实现&#xff0c;包括界面布局到人机交互再到底层核心函数功能。整体设计框架基于数字摄影测量的专业处理流程&#xff0c;实现了数据输入、数据预处理、影像信息检测、空间定向、地形三维建模、专题信息提取、成果输出与更新等功能。同时为…

Android 10.0 系统设置语言和输入法菜单Launage语言列表增加支持多种英语语言功能

1.前言 在10.0的系统ROM产品定制化开发中,在系统中的语言和输入法菜单中,在添加语言的默认列表中对于同一类型的语言就可以 会出现一中语言,比如多种英语类型 就显示的不全,所以要求显示所有的英语类型,这样就需要了解语言列表的加载流程 然后加载所有的英语类型,接下来…

【深度学习】多层感知机与卷积神经网络解析

引言&#xff1a; 在人工智能的宏伟画卷中&#xff0c;深度学习如同一笔瑰丽而深邃的色彩&#xff0c;为这幅画增添了无限的生命力和潜能。作为支撑这一领域核心技术的基石&#xff0c;多层感知机&#xff08;MLP&#xff09;和卷积神经网络&#xff08;CNN&#xff09;在模仿人…

安全风险攻击面管理如何提升企业网络弹性?

从研究人员近些年的调查结果来看&#xff0c;威胁攻击者目前非常善于识别和利用最具有成本效益的网络入侵方法&#xff0c;这就凸显出了企业实施资产识别并了解其资产与整个资产相关的安全态势的迫切需要。 目前来看&#xff0c;为了在如此复杂的网络环境中受到最小程度上的网络…

Lumos学习python第九课:VSCode+Anaconda

注意Anaconda版本和Python版本的对应关系&#xff0c;同一个Anaconda可以支持多个Python版本&#xff0c; 注&#xff1a;现在vscode已原生支持jupyter notebook&#xff08;要求Python版本>3.6&#xff09; Anaconda在Python解析器的基础上封装了很多Python包&#xff0c…

【CVE-2010-2883】进行钓鱼攻击的研究

最近作业中研究APT攻击&#xff0c;了解到2011年前后披露的LURID-APT&#xff0c;其中敌手利用了各种版本的文件查看器的漏洞实现攻击。CVE-2010-2883就是其中被利用的一个adobe reader的漏洞。特此复现&#xff0c;更好的研究和防范APT攻击。 本文仅仅是对相关漏洞利用的学习…

基于JAVA的校园失物招领平台

采用技术 基于JAVA的校园失物招领平台的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员功能 论坛管理 失物认领管理 寻物启事管理 用户管理 失物…

鸿蒙实战开发-如何实现选择并查看文档与媒体文件

介绍 应用使用ohos.file.picker、ohos.multimedia.mediaLibrary、ohos.file.fs 等接口&#xff0c;实现了picker拉起文档编辑保存、拉起系统相册图片查看、拉起视频并播放的功能。 效果预览 使用说明&#xff1a; 在首页&#xff0c;应用展示出最近打开过的文档信息&#xf…

用html实现一个动态的文字框

<!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>一个动态的文字框动画</title><link rel"stylesheet" href"./style.css"></head> <body> <link rel…

混合云构建-如何通过Site to Site VPN 连接 AWS 和GCP云并建立一个高可用的VPN通信

如果我们的业务环境既有AWS云又有GCP云,那么就需要将他们打通,最经济便捷的方式就是通过Site-to-Site VPN连接AWS和GCP云,你需要在两个云平台上分别配置VPN网关,并建立一个VPN隧道来安全地连接这两个环境,我们下面演示一个高可用场景下的S2S VPN线路构建,采用动态BGP协议…

【数据结构(四)】链表经典练习题

❣博主主页: 33的博客❣ ▶️文章专栏分类:数据结构◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.删除值为key的所有结点3.反转链表4.返回中间结点5.输出倒数第k个结点6.链表…

C++11 设计模式1. 模板方法(Template Method)模式学习。UML图

一 什么是 "模板方法&#xff08;Template Method&#xff09;模式" 在固定步骤确定的情况下&#xff0c;通过多态机制在多个子类中对每个步骤的细节进行差异化实现&#xff0c;这就是模板方法模式能够达到的效果。 模板方法模式属于&#xff1a;行为型模式。 二 &…

Hive的分区与排序

一、Hive分区 1.引入&#xff1a; 在大数据中&#xff0c;最常见的一种思想就是分治&#xff0c;我们可以把大的文件切割划分成一个个的小的文件&#xff0c;这样每次操作一个个小的文件就会很容易了&#xff0c;同样的道理&#xff0c;在hive当中也是支持这种思想的&#xff…

SQL注入sqli_labs靶场第三题

?id1and 11 and 11和?id1and 11 and 11进行测试如果11页面显示正常和原页面一样&#xff0c;并且12页面报错或者页面部分数据显示不正常&#xff0c;那么可以确定此处为字符型注入。 根据报错信息判断为单引号带括号注入 联合查询&#xff1a; 猜解列名 ?id1) order by 3-…