java集合进阶篇-《HashSet和LinkedHashSet详解》

ops/2024/10/25 5:21:43/

dc36953054264521b68a923efe53222c.png个人主页→VON

cebd6b4f65b24cda84e774c03af300c0.png收录专栏→java从入门到起飞

目录

​编辑

一、前言

二、简要概述

三、Set集合

四、HashSet集合

五、LinkedHashSet集合


一、前言

HashSet集合和LinkHashSet集合都是Set集合的分支集合,语法大致相同。这些众多的集合虽然许多地方都十分相近,但是底层的原理还是大相径庭的。希望大家能够仔细分辨。

二、简要概述

在Java中,Set是一个不允许包含重复元素的集合。Set接口是Collection接口的子接口,它继承了Collection的所有方法,并且增加了对唯一性元素存储的支持。Set的主要实现类有以下几种:

HashSet

  • 基于哈希表实现。
  • 不保证元素的存储顺序。
  • 插入、删除和查找操作的时间复杂度为 O(1),即常数时间。
  • 元素可以通过hashCode()equals()方法来确定其位置。

LinkedHashSet

  • 继承自HashSet,但在内部使用了一个双向链表来链接所有的条目。
  • 保持元素的插入顺序。
  • 通常比HashSet慢一点,因为维护了链表的连接关系。

三、Set集合

Set集合的特点

  • 无序、不重复、无索引
  • Set集合的方法上基本与Collection的API一致

Set集合的实现类特点

  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:可排序、不重复、无索引
     
java">package ArrayDemo.SetDemo;import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class A01_SetDemo01 {public static void main(String[] args) {// 1.创建一个Set集合的对象Set<String> s = new HashSet<>();// 2.添加元素// 如果元素是第一次添加,则可以添加成功,返回true// 如果元素是第二次添加,则添加失败,返回falseSystem.out.println(s.add("张"));// trueSystem.out.println(s.add("李"));// trueSystem.out.println(s.add("李"));// falseSystem.out.println(s.add("李"));// falseSystem.out.println(s);// [张, 李]// 3.遍历集合// 增强for遍历for (String s1 : s) {System.out.println(s1);}// 迭代器遍历Iterator<String> str = s.iterator();while(str.hasNext()){System.out.println(str.next());}// Lambda表达式s.forEach(str1 -> System.out.println(str1));}
}

四、HashSet集合

Student类在这里就不过多赘述了,直接快速生成就行了。快捷键想必大家也十分熟悉了。


哈希值:


对象的整体表现形式

  • 如果没有重写hashCode方法,计算出的哈希值是不同的
  • 如果已经重写hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的
  • 但是在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样

  

java">package ArrayDemo.SetDemo;public class A02_HashSetDemo01 {public static void main(String[] args) {// 1.创建对象Student s1 = new Student("zhang",18);Student s2 = new Student("zhang",18);// 2.如果没有重写hashCode方法,计算出的哈希值是不同的System.out.println(s1.hashCode());// 495053715System.out.println(s2.hashCode());// 1922154895// 3.如果已经重写hashCode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的System.out.println(s1.hashCode());// -703165081System.out.println(s1.hashCode());// -703165081// 4.但是在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样System.out.println("abc".hashCode());// 96354System.out.println("acD".hashCode());// 96354}
}

需求:
创建一个存储学生对象的集合,存储多个学生对象
使用程序实现在控制台遍历该集合
要求:学生对象的成员变量值相同,我们就认为是同一个对象

java">package ArrayDemo.SetDemo;import java.util.HashSet;public class A03_HashSetDemo02 {public static void main(String[] args) {// 1.创建四个学生对象Student s1 = new Student("zhang",18);Student s2 = new Student("wang",18);Student s3 = new Student("li",18);Student s4 = new Student("zhang",18);// 2.创建集合存储学生对象HashSet<Student> hs1 = new HashSet<>();HashSet<Student> hs2 = new HashSet<>();// 3.添加元素(没有重写HashSet)System.out.println(hs1.add(s1));// trueSystem.out.println(hs1.add(s2));// trueSystem.out.println(hs1.add(s3));// trueSystem.out.println(hs1.add(s4));// trueSystem.out.println(hs1);// [Student{name = zhang, age = 18}, Student{name = li, age = 18}, Student{name = zhang, age = 18}, Student{name = wang, age = 18}]// 4.添加元素(重写HashSet)System.out.println(hs2.add(s1));// trueSystem.out.println(hs2.add(s2));// trueSystem.out.println(hs2.add(s3));// trueSystem.out.println(hs2.add(s4));// falseSystem.out.println(hs2);// [Student{name = zhang, age = 18}, Student{name = li, age = 18}, Student{name = wang, age = 18}]}
}

五、LinkedHashSet集合

java">package ArrayDemo.SetDemo;import java.util.LinkedHashSet;public class A04_LinkedHashSetDemo04 {public static void main(String[] args) {// LinkedHashSet集合的特点和原理// 有序、不重复、无索引// 底层基于哈希表、使用双链表记录添加顺序// 1.创建四个学生对象Student s1 = new Student("zhang",18);Student s2 = new Student("wang",18);Student s3 = new Student("li",18);Student s4 = new Student("zhang",18);// 2.创建集合对象LinkedHashSet<Student> lhs = new LinkedHashSet<>();// 3.添加学生对象System.out.println(lhs.add(s1));// trueSystem.out.println(lhs.add(s3));// trueSystem.out.println(lhs.add(s2));// trueSystem.out.println(lhs.add(s4));// falseSystem.out.println(lhs);// [Student{name = zhang, age = 18}, Student{name = li, age = 18}, Student{name = wang, age = 18}]}
}


http://www.ppmy.cn/ops/128247.html

相关文章

Unity3D 自动化资源打AB包详解

在Unity3D开发中&#xff0c;AssetBundles&#xff08;简称AB包&#xff09;是一种将资源&#xff08;如模型、纹理、音频等&#xff09;打包成单独文件的方法&#xff0c;这些文件可以在运行时从服务器下载并加载到游戏中。自动化资源打包成AB包可以显著提高开发效率&#xff…

【计网】从零开始认识IP协议 --- 理解网段划分,NAT策略,私有IP和公网IP,认识公网

任何收获都不是偶然&#xff0c; 一点一滴的进步终会让未来的你焕然一新&#xff01; 从零开始认识IP协议 1 为什么要进行网段划分2 特殊IP地址与数量限制3 私有IP和公网IP4 彻底理解网段划分5 认识公网 1 为什么要进行网段划分 我们以一个例子来讲解为什么要进行网段划分&a…

自动驾驶系列—图像数据在自动驾驶中的关键角色及其实际应用场景探讨

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

hardhat部署智能合约

Hardhat安装 安装node 可以使用 nvm 安装node GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions 安装Hardhat 打开命令行工具&#xff0c;输入&#xff1a; mkdir hardhat-demo cd hardhat-demo npm i…

QGIS之三十二DEM地形导出三维模型gltf

效果 1、准备数据 (1)dem.tif (2)dom.tif 2、qgis加载dem和dom数据 3、安装插件 插件步骤可以参考这篇文章 QGIS之二十四安装插件 安装了Qgis2threejs插件,结果

前言——25机械考研复试专业面试问题汇总 机械复试超全流程攻略 机械复试看这一个专栏就够用了!机械复试调剂英语自我介绍口语专业面试常见问题总结 机械保研面试

一、开篇寄语&#xff1a; 在准备考研复试的关键时期&#xff0c;许多学弟学妹们往往会寻求各种资料来辅助复习&#xff0c;市面上也因此涌现了大量的“考研复试全流程全攻略”。然而&#xff0c;这些攻略往往存在以下问题&#xff1a; 1、内容不完整性 遗漏关键信息&#x…

Docker可视化管理工具DockerUI的使用

DockerUI是一个易用且轻量化的 Docker 管理工具&#xff0c;透过 Web 界面的操作&#xff0c;更方便对于 Docker 指令不熟悉的用户更容易操作 Docker 。 DockerUI拥有易操作化化界面&#xff0c;不须记忆Docker指令&#xff0c;仅需下载镜像即可立刻加入完成部署。基于 Docker…

CTFHUB技能树之文件上传——无验证

开启靶场&#xff0c;打开链接&#xff1a; 直接上传一句话木马&#xff1a; <?php eval($_POST[pass]);?> 成功提交并显示了上传的文件的路径 访问一下该文件触发一句话木马&#xff1a; 看到一片空白是正常的&#xff0c;因为没有写什么函数&#xff0c;比如&#x…