Java Set基础篇

目录

  • 前言
  • 一、常用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<>();//将元素添加到set1set1.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.mzph.cn/news/807186.shtml

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

相关文章

如何在Rust中操作JSON

❝ 越努力&#xff0c;越幸运 ❞ 大家好&#xff0c;我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder。 前言 我们之前在Rust 赋能前端-开发一款属于你的前端脚手架中有过在Rust项目中如何操作JSON。 由于文章篇幅的原因&#xff0c;我们就没详细介绍…

基于SSM的教材管理系统

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的教材管理系统2拥有两种角色 管理员&#xff1a;教师管理、分类管理、教材管理、入库和出库管理、教材申请管理等 教师&#xff1a;查看教材、申请教材 1.1 背景描述 SSM教材管…

服务器数据恢复—EqualLogic PS6100系列存储数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌EqualLogic PS6100系列存储阵列是一款容错功能较强的存储设备&#xff0c;具有较高的安全性能。一些硬件故障或者误操作也会破坏该系列存储内的数据&#xff0c;下面分享一个北亚企安数据恢复工程师接到的一个关于EQ PS6100存储的数据恢复…

java版数字藏品深色UI仿鲸探数藏盲盒合成短视频卡牌模式支持高并发

Java版数字藏品深色UI仿鲸探数藏盲盒合成短视频卡牌模式支持高并发&#xff0c;是一种结合了Java技术、深色用户界面&#xff08;UI&#xff09;设计、数字藏品概念、盲盒合成玩法以及短视频卡牌模式的综合性应用。该模式旨在为用户提供一种新颖、有趣的数字藏品体验&#xff0…

LC 450.删除二叉搜索树中的节点

450.删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分…

解锁CodeGeeX智能问答中3项独有的隐藏技能

CodeGeeX是一款强大的AI编程助手&#xff0c;它能帮你快速解决编程中的各种问题。无论是代码调试、功能实现&#xff0c;还是学习新语言&#xff0c;CodeGeeX都能助你一臂之力。 在IDE中搜索“CodeGeeX”就可以免费下载使用 CodeGeeX在侧边栏提供的Ask CodeGeeX智能问答功能&a…

代码随想录-算法训练营day04【链表02:两两交换链表中的节点、删除链表的倒数第N个节点、链表相交、环形链表II】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第二章 链表part02● day 1 任务以及具体安排&#xff1a;https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY ● day 2 任务以及具体安排&#xff1a;https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG ● day 3 任务以及具体安排…

C++第十六弹---string使用(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、标准库中的string类 1.1、string类的常用接口说明 1.1.1、string类对象的常见构造 1.1.2、string类对象的容量操作 1.1.3、string类对象的…

网上打印a4纸大概多少钱一张

在快节奏的现代生活中&#xff0c;网上打印服务因其便捷性而受到越来越多用户的青睐。对于许多需要打印大量文件的用户来说&#xff0c;了解网上打印A4纸的价格至关重要。那么&#xff0c;网上打印A4纸300页大概需要多少钱呢&#xff1f; 网上打印价格取决于多个因素&#xff…

Severt和tomcat的使用(补充)

打包程序 在pom.xml中添加上述代码之后打包时会生成war包并且包的名称是test 默认情况打的是jar包.jar里量但是tomcat要求的是war包. war包Tomcat专属的压缩包. war里面不光有.class还有一些tomcat要求的配置文件(web.xml等)还有前端的一些代码(html, css, js) 点击其右边的m…

前端学习<四>JavaScript基础——14-基本包装类型

基本数据类型不能绑定属性和方法 属性和方法只能添加给对象&#xff0c;不能添加给基本数据类型。我们拿字符串来举例。 1、基本数据类型&#xff1a; 基本数据类型string是无法绑定属性和方法的。 var str qianguyihao;​str.aaa 12;console.log(typeof str); //打印结果…

十大经典排序算法及其C语言实现--带动图展示

排序算法大概算起来有以下十种 一、冒泡排序&#xff08;Bubble Sort&#xff09; 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数…

python统计分析——一般线性回归模型

参考资料&#xff1a;python统计分析【托马斯】 当我想用一个或多个其他的变量预测一个变量的时候&#xff0c;我们可以用线性回归的方法。 例如&#xff0c;当我们寻找给定数据集的最佳拟合线的时候&#xff0c;我们是在寻找让下式的残差平方和最小的参数(k,d)&#xff1a; 其…

基于51单片机的秒表设计—0.01精度99.99s

基于51单片机的秒表设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.数码管显示秒表&#xff0c;精度为0.01&#xff1b; 2.记时最大为99.99s,过后清零记数。 3.一个按键实现开始…

突破传统,创新营销:淘宝天猫详情接口API的无限可能

随着互联网的迅猛发展&#xff0c;电子商务平台成为了现代商业营销的重要组成部分。淘宝和天猫作为中国最大的电子商务平台之一&#xff0c;拥有庞大的商品数据库和海量的买家资源。为了更好地实现个性化、精准化的营销策略&#xff0c;淘宝天猫推出了详情接口API&#xff0c;联…

Kibana管理ES生命周期

希望通过Kibana界面管理ES索引的生命周期 版本&#xff1a;7.15.2 创建索引模板 创建索引模板方便匹配索引&#xff0c;对匹配到的一批索引采用同一套生命周期管理策略&#xff0c;例如开发环境的所有索引以dev-开头&#xff0c;可以创建样式为dev-*的索引模板以匹配开发环境…

uni-starter和uni-admin初始化

1. 初始化uni-starter项目之后需要在uniCloud–>cloudfunctions–>common–>uni-config-center下面新增uni-id文件夹&#xff0c;下面新增config.json文件。 1.1配置好tokenSecret和微信的appId&#xff0c;appSecret等,如下&#xff1a; {"passwordSecret"…

pygame旋转角度发射射线

self.x self.x math.cos(math.radians(self.xuanzhuanjiao)) * 70 self.y self.y - math.sin(math.radians(self.xuanzhuanjiao)) * 70 旋转角度&#xff0c;70是间隔 间隔太小会卡 import pygame from pygame.locals import * import sys import mathpygame.init()width, …

03-JAVA设计模式-装饰模式

装饰模式 什么装饰模式 装饰器模式&#xff08;Decorator Pattern&#xff09;也叫包装器模式&#xff0c;是一种结构型设计模式&#xff0c;允许用户在不改变对象的情况下&#xff0c;动态地给对象增加一些额外的职责&#xff08;功能&#xff09;。装饰器模式相比生成子类更…

echarts 多环形图

环形图效果&#xff1a; option {"angleAxis": {"max": 1,"show": false,"splitLine": {"show": false},"axisLabel": {"show": false},"axisTick": {"show": false}},"ra…