当前位置: 首页 > news >正文

java中的set集合及其子类

Set系列集合:添加的元素是无序(添加的数据的顺序和获取出数据顺序不一样),不重复,无索引

如:HashSet:无序,不可重复,无索引

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

TreeSet:按照大小默认升序排序,不重复,无索引

public class java {public static void main(String[] args) {//1:创建一个set对象Set<Integer>set=new HashSet<>();//Set是一个抽象类set.add(111);set.add(111);set.add(444);set.add(444);set.add(444);set.add(888);set.add(888);System.out.println(set);//[888, 444, 111]-->HashSet无序,不重复,无索引}
}

哈希值:

就是一个int类型的数值,java对象都有一个
哈希值

java中所有的对象都可以调用Object类提供的hashCode方法,返回自己对象的哈希值

对象哈希值的特点:
同一个对象多次调用hashCode()方法返回的哈希值是相同的

不同的对象哈希值一般不同,但也有可能相同(哈希碰撞) 

HashSet集合的底层原理:
基于哈希表:数组+链表+红黑树

注意:HashSet集合默认不能对内容一样的两个对象去重复!

比如两个相同内容的对象存入到HashSet集合中去,HashSet不能去重复

Student类:
 

public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

public class test {public static void main(String[] args) {HashSet<Student>hashset=new HashSet<>();hashset.add(new Student("hh",12));hashset.add(new Student("hh",12));hashset.add(new Student("aa",88));System.out.println(hashset);// [Student{name='aa', age=88}, Student{name='hh', age=12}, Student{name='hh', age=12}]}
}

方法:重写equals,hashcode方法

@Override//两个对象的内容一样返回true,不重写的话比较的是地址public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Override//只要两个对象的内容一样,哈希值一样public int hashCode() {return Objects.hash(name, age);

结果:[Student{name='aa', age=88}, Student{name='hh', age=12}]

LinkHashSet:

有序,不重复,无索引

TreeSet:
不重复,无索引,可排序(默认是升序排序,按照元素从大到小默认排序) 

对于数值类型:直接按照大小进行排序

对于字符串类型:默认按照首字符的编号升序排序

public class test {public static void main(String[] args) {TreeSet<Integer>treeSet=new TreeSet<>();treeSet.add(12);treeSet.add(10);treeSet.add(11);System.out.println(treeSet);//[10, 11, 12]}
}

如何实现自定义排序:

直接排序自定义对象会报错

方法一:让自定义的类实现Comparable接口,重写里面的compareTo方法来指定比较规则

//方法一:实现Comparable
public class Student implements Comparable<Student>{private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic int compareTo(Student o) {return this.age-o.age;//按照年龄升序}
}
public class test2 {public static void main(String[] args) {TreeSet treeSet =new TreeSet<>();treeSet.add(new Student("aa",18));treeSet.add(new Student("cc",20));treeSet.add(new Student("bb",19));treeSet.add(new Student("bb",19));System.out.println(treeSet);//[Student{name='aa', age=18}, Student{name='bb', age=19}, Student{name='cc', age=20}]}
}

方法二:通过调用TreeSet集合的有参构造器,可以设置comparator对象(用Lambda表达式)

public class test3 {public static void main(String[] args) {//方法二:/*TreeSet<Student>treeSet=new TreeSet<>(new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getAge()-o2.getAge();}});*/TreeSet<Student>treeSet=new TreeSet<>((o1,o2)->o1.getAge()-o2.getAge() );treeSet.add(new Student("aa",18));treeSet.add(new Student("cc",20));treeSet.add(new Student("bb",19));treeSet.add(new Student("bb",19));System.out.println(treeSet);}
}

相关文章:

java中的set集合及其子类

Set系列集合&#xff1a;添加的元素是无序&#xff08;添加的数据的顺序和获取出数据顺序不一样&#xff09;&#xff0c;不重复&#xff0c;无索引 如&#xff1a;HashSet:无序&#xff0c;不可重复&#xff0c;无索引 LinkedHashSet:有序&#xff0c;不重复&#xff0c;无索…...

shell脚本查询匹配文件进行操作

1.寻找文件并赋权 查询当前目录及子目录下所有以“sh”结尾的文件&#xff0c;并赋执行权限。 #!/bin/bash # 将当前目录及子目录下所有以“sh”结尾的文件添加可执行权限 find ./ -name "*.sh" -type f -exec chmod x {} 2.寻找文件并删除 查询当前目录及子目录下存…...

vulnhub----natraj靶机

文章目录 一.信息收集1.网段探测2.端口扫描3.版本服务探测4.漏扫5.目录扫描 二.漏洞利用1.分析信息2..fuzz工具 三.getshell四.提权六.nmap提权 一.信息收集 1.网段探测 因为使用的是VMware&#xff0c;靶机的IP地址是192.168.9.84 ┌──(root㉿kali)-[~/kali/vulnhub] └─…...

Web Component 组件库有什么优势

前言 前端目前比较主流的框架有 react&#xff0c;vuejs&#xff0c;angular 等。 我们通常去搭建组件库的时候都是基于某一种框架去搭建&#xff0c;比如 ant-design 是基于 react 搭建的UI组件库&#xff0c;而 element-plus 则是基于 vuejs 搭建的组件库。 可能你有这种体…...

如何配置vite的proxy

1.前言 vite项目&#xff0c;本地开发环境可以通过配置proxy代理实现跨域请求。但是生产环境&#xff0c;该配置不生效&#xff0c;一般使用 nginx 转发&#xff0c;或者后端配置cors 2.解释 server: {port: 9000,proxy: { // 本地开发环境通过代理实现跨域&#xff0c;生产…...

Linux CentOS基础操作

Linux CentOS基础操作 1. 查看Linux服务器当前主机名等 hostname 2. 查看当前系统日期和时间 date -d -y 3. 显示网络接口信息&#xff0c;获取当前网卡状态&#xff0c;启动、停止网卡&#xff0c;网卡等闪烁显示30秒&#xff0c;配置网卡(网卡名称&#xff1a;eth1)的IP地址…...

最佳情侣身高差

题目描述 专家通过多组情侣研究数据发现&#xff0c;最佳的情侣身高差遵循着一个公式&#xff1a;&#xff08;女方的身高&#xff09;1.09 &#xff08;男方的身高&#xff09;。如果符合&#xff0c;你俩的身高差不管是牵手、拥抱、接吻&#xff0c;都是最和谐的差度。 下面…...

谷歌开发者账号防关联:如何选择性价比高的VPS,阿里、腾讯、酷鸟、AWS?

在Google Play上架应用的开发者朋友们&#xff0c;可能需要多个开发者账号来上架马甲包或矩阵式上架应用。但谷歌那边又不让一个人搞多个账号&#xff0c;所以&#xff0c;要想不被谷歌抓包&#xff0c;就得做好防关联的功课&#xff0c;确保每个账号都像是独立的个体。 而说到…...

Virtual digital asset $E=$eaco. EarthChain

Virtual digital asset $E$eaco. EarthChain Виртуальный цифровой актив $E $eaco. Цепочка Земля. 仮想デジタル資産$E$eaco.アースチェーン. Activos digitales virtuales $e $oaco. cadena terrestre. Virtuelles digitales Asset $E…...

[计算机网络] 当输入网址到网页

HTTP 首先&#xff0c;对URL进行解析&#xff0c;URL包含了Web服务器和对应的文件&#xff08;文件路径&#xff09; URL是请求服务器中的文件资源 通过Web服务器和对应文件来生产HTTP包&#xff08;超文本传输协议&#xff09; DNS 根据域名查询对应的IP地址 域名的层级 根…...

五年经验,还不懂小表驱动大表

小表驱动大表&#xff0c;也就是说用小表的数据集驱动大表的数据集。假如有order和user两张表&#xff0c;其中order表有10000条数据&#xff0c;而user表有100条数据。 这时如果想查一下&#xff0c;所有有效的用户下过的订单列表。可以使用in关键字实现&#xff1a; select…...

springboot+websocket+微信小程序实现评论区功能

springbootwebsocket微信小程序实现评论区功能 WebSocketSTOMP协议具体实现1.在pom文件中添加Spring WebSocket依赖2. 创建WebSocket配置类3.接收发送消息4.前端 参考 WebSocket 1. 什么是WebSocket&#xff1f; WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双…...

【项目】如何在面试中介绍自己的项目经验(附如何解决未知的问题成长路线)

【项目】如何在面试中介绍自己的项目经验&#xff08;附如何解决未知的问题&成长路线&#xff09; 文章目录 1、为什么要准备项目介绍&#xff1f;2、如何准备一份好的项目介绍&#xff1f;3、如何回答项目提问&#xff1f;4、如何避免低级错误&#xff1f;5、如何通过引导…...

解决Selenium元素拖拽不生效Bug

前几天在使用Selenium进行元素拖拽操作时&#xff0c;发现Selenium自带的元素拖拽方法&#xff08;dragAndDrop()&#xff09;不生效&#xff0c;网上的回答也是五花八门&#xff0c;比较混乱&#xff0c;尝试了以下几种方法均无法解决。 方案1&#xff1a;通过dragAndDrop()方…...

提示工程中的10个设计模式

我们可以将提示词定义为向大型语言模型(Large Language Model&#xff0c;LLM)提供的一个查询或一组指令&#xff0c;这些指令随后使模型能够维持一定程度的自定义或增强&#xff0c;以改进其功能并影响其输出。我们可以通过提供细节、规则和指导来引出更有针对性的输出&#x…...

提高网站安全性,漏洞扫描能带来什么帮助

随着互联网的蓬勃发展&#xff0c;网站已经成为人们获取信息、交流思想、开展业务的重要平台。然而&#xff0c;与之伴随的是日益严重的网络安全问题&#xff0c;包括恶意攻击、数据泄露、隐私侵犯等。 为了保障网站的安全性&#xff0c;提前做好网站的安全检测非常有必要&…...

不要再使用 @Builder 注解了!有深坑呀!

曾经&#xff0c;我在《千万不要再随便使用 lombok 的 Builder 了&#xff01;》 一文中提到 Builder 注解的其中一个大坑会导致默认值失效&#xff01; 最近阅读了 《Oh !! Stop using Builder》 发现 Builder 的问题还不止一个&#xff0c;Builder 会让人误以为是遵循构建器…...

《UE5_C++多人TPS完整教程》学习笔记31 ——《P32 角色移动(Character Movement)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P32 角色移动&#xff08;Character Movement&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…...

怎么使用jwt,token以及redis进行续期?

怎么使用jwt&#xff0c;token以及redis进行续期&#xff1f; 什么是jwt? 什么是token? 结合 JWT、Token 和 Redis 进行续期的一般步骤&#xff1a; 生成 JWT&#xff1a; 用户登录成功后&#xff0c;服务器生成一个 JWT&#xff0c;并返回给客户端。 import io.jsonwebtok…...

AI日报:北大Open Sora视频生成更强了;文心一言可以定制你自己的声音;天工 SkyMusic即将免费开放;

&#x1f916;&#x1f4f1;&#x1f4bc;AI应用 北大Open Sora视频生成更强了!时长可达10秒&#xff0c;分辨率更高 【AiBase提要:】 ⭐️ Open-Sora-Plan v1.0.0模型发布 显著提升视频生成质量和文本控制能力 ⭐️ 支持华为昇腾910b芯片&#xff0c;提升运行效率和质量。 ⭐…...

3步诊断显存故障:memtest_vulkan如何帮你精准定位显卡问题?

3步诊断显存故障&#xff1a;memtest_vulkan如何帮你精准定位显卡问题&#xff1f; 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 在显卡稳定性测试领域&#…...

SMUDebugTool终极指南:轻松解锁AMD Ryzen处理器的隐藏性能

SMUDebugTool终极指南&#xff1a;轻松解锁AMD Ryzen处理器的隐藏性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…...

启动器故障排除指南:Java环境修复与第三方冲突解决

启动器故障排除指南&#xff1a;Java环境修复与第三方冲突解决 【免费下载链接】PCL Minecraft 启动器 Plain Craft Launcher&#xff08;PCL&#xff09;。 项目地址: https://gitcode.com/gh_mirrors/pc/PCL 当使用Minecraft启动器安装Forge时遇到"java.lang.NoC…...

3个核心技巧:快速掌握Blender 3MF插件的完整工作流

3个核心技巧&#xff1a;快速掌握Blender 3MF插件的完整工作流 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否在为3D打印工作流中的文件格式转换烦恼&#xff1f;…...

QWEN-AUDIO与其他AI工具共存:如何合理分配GPU资源?

QWEN-AUDIO与其他AI工具共存&#xff1a;如何合理分配GPU资源&#xff1f; 1. 多AI工具共存的挑战与解决方案 在当前的AI应用场景中&#xff0c;单一GPU服务器往往需要同时运行多个AI模型。QWEN-AUDIO作为一款高性能语音合成系统&#xff0c;如何与其他视觉、语言模型和谐共存…...

OnmyojiAutoScript:阴阳师智能自动化脚本完全指南

OnmyojiAutoScript&#xff1a;阴阳师智能自动化脚本完全指南 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 还在为阴阳师每日重复任务感到疲惫吗&#xff1f;每天花费数小时在…...

从单片机到Linux驱动的技术成长与转型

1. 从单片机到Linux驱动的技术成长之路 刚毕业那会儿&#xff0c;我和大多数电子工程专业的同学一样&#xff0c;怀揣着对技术的无限憧憬。记得大四校招时&#xff0c;我固执地只投递了几家知名大厂的嵌入式开发岗位&#xff0c;甚至在面试时直接报出了远超应届生水平的薪资期望…...

标普油气ETF富国(513350.SH)逆势走强、半导体承压:地缘扰动与产业逻辑共振下的ETF分化走势

4月2日&#xff0c;市场全天震荡调整&#xff0c;创业板指、科创50指数均跌超2%。板块方面&#xff0c;医药板块逆势走强&#xff0c;油气股表现活跃&#xff0c;光纤概念反复走强&#xff1b;算力租赁概念集体调整。ETF方面&#xff0c;标普油气ETF富国&#xff08;513350.SH&…...

Mavlink协议解析:从Pixhawk飞控到QGC地面站的完整通信流程

Mavlink协议深度解析&#xff1a;构建Pixhawk与QGC的高效通信桥梁 当Pixhawk飞控的LED指示灯开始规律闪烁&#xff0c;QGC地面站的地图上突然出现了一个蓝色圆点——这看似简单的连接背后&#xff0c;隐藏着一套精密的通信语言体系。Mavlink协议就像无人机系统的神经网络&#…...

94吨黄金“上链搬家”,手续费仅0.0016%!黄金RWA正在改写跨境资产流动

传统金融数百万美元的物流成本vs区块链毫厘之间的链上费用&#xff0c;资产数字化的未来已来。近日&#xff0c;Tether首席执行官Paolo Ardoino在X平台发文称&#xff1a;过去6个月内&#xff0c;共有价值约94吨黄金的代币化黄金XAUT在链上完成转移&#xff0c;合计手续费仅约0…...