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

HashSet、LinkedHashSet详解

HashSet底层原理:

  采用哈希表存储数据。JDK8以前,哈希表由数组+链表组成。JDK8开始,由数组+链表+红黑树组成。

①创建一个默认长度16, 默认加载因为0.75的数组,数组名table

②根据元素的哈希值跟数组的长度计算出应存入的位置

③判断当前位置是否为null, 如果是null直接存入

④如果位置不为null, 表示有元素,则调用equals方法比较属性值

⑤一样:不存       不一样:存入数组,形成链表

      JDK8以前:新元素存入数组,老元素挂在新元素下面

      JDK8以后:新元素直接挂在老元素下面

注意:JDK8以后,当链表长度超过8,而且数组长度大于等于64时,自动转换为红黑树

           如果集合中存储的是自定义对象,必须重写hashCode和equals方法

  (利用hashCode方法得到哈希值,可以确定该元素添加到数组的哪个位置。利用equals比较对        象内部的属性值是否相同)

代码练习:

利用HashSet集合去除重复元素

需求:创建一个存储学生对象的集合,存储多个学生对象。使用程序实现在控制台遍历该集合。

要求:学生对象的成员变量值相同,我们就认为是同一个对象

public class Student {private String name;private int age;public Student(){}public Student(String name,int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {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);}
}
public class A02_HashSetDemo1 {public static void main(String[] args) {//1.创建三个学生对象Student s1 = new Student("zhangsan",23);Student s2 = new Student("lisi",24);Student s3 = new Student("wangwu",25);Student s4 = new Student("zhangsan",23);//2.创建集合用来添加学生HashSet<Student> hs = new HashSet<>();//3.添加元素System.out.println(hs.add(s1));//trueSystem.out.println(hs.add(s2));//trueSystem.out.println(hs.add(s3));//trueSystem.out.println(hs.add(s4));//false//4.打印集合System.out.println(hs);}
}

LinkedHashSet底层原理

●有序、不重复、无索引。

●这里的有序指的是保证存储和取出的元素顺序一致

●原理:底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序。

代码:

public class A03_LinkedHashSetDemo3 {public static void main(String[] args) {//1.创建四个学生对象Student s1 = new Student("zhangsan",23);Student s2 = new Student("lisi",24);Student s3 = new Student("wangwu",25);Student s4 = new Student("zhangsan",23);//2.创建集合对象LinkedHashSet<Student> lsh = new LinkedHashSet<>();System.out.println(lsh.add(s1));System.out.println(lsh.add(s2));System.out.println(lsh.add(s3));System.out.println(lsh.add(s4));//flaseSystem.out.println(lsh);}
}

文章转载自:

http://8sDQ00Qj.pqcsx.cn
http://hZ4g5R26.pqcsx.cn
http://De8piW4E.pqcsx.cn
http://jfTpBYxr.pqcsx.cn
http://1SqyVQ7K.pqcsx.cn
http://49KuWNho.pqcsx.cn
http://BuCNPdVT.pqcsx.cn
http://qtsLVkho.pqcsx.cn
http://5Hh26Mia.pqcsx.cn
http://M9uFhska.pqcsx.cn
http://x6QMqL4d.pqcsx.cn
http://ro1avPqM.pqcsx.cn
http://8KaGEHwA.pqcsx.cn
http://xCfrZcQh.pqcsx.cn
http://NLgN3fVk.pqcsx.cn
http://DxurzW6f.pqcsx.cn
http://hDB9jz9R.pqcsx.cn
http://COgrlCA1.pqcsx.cn
http://Wm7RZC1N.pqcsx.cn
http://qC6MpxHe.pqcsx.cn
http://vIMey4YA.pqcsx.cn
http://mJSlZ6Ai.pqcsx.cn
http://zpJYL3Vw.pqcsx.cn
http://z16XqC5y.pqcsx.cn
http://lEUX66ps.pqcsx.cn
http://ASZbVSHw.pqcsx.cn
http://Ovw0nFA3.pqcsx.cn
http://9cVXuQsS.pqcsx.cn
http://ZdOV0x34.pqcsx.cn
http://nuicott8.pqcsx.cn
http://www.dtcms.com/a/371502.html

相关文章:

  • 大语言模型注意力机制(Attention Mechanism)
  • 【Redis】常用数据结构之Hash篇:从常用命令到使用场景详解
  • 去中心化投票系统开发教程 第四章:前端开发与用户界面
  • 使用csi-driver-nfs实现K8S动态供给
  • linux内核 - 获取内核日志时间戳的方法
  • 从0到1学习Vue框架Day01
  • K8S-Pod(下)
  • RocketMQ事务消息:分布式系统的金融级可靠性保障
  • OSPF基础部分知识点
  • k8s核心技术-Helm
  • 《P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G》
  • GitHub App 架构解析与最佳实践
  • PPP(点对点协议)详细讲解
  • 人工智能优化SEO关键词的实战策略
  • Git高阶实战:Rebase与Cherry-pick重塑你的工作流
  • 【机器学习】通过tensorflow搭建神经网络进行气温预测
  • 基于 Django+Vue3 的 AI 海报生成平台开发博客(海报模块专项)
  • 线程间通信
  • 文件上传之读取文件内容保存到ES
  • 图神经网络分享系列-SDNE(Structural Deep Network Embedding) (一)
  • sentinel限流常见的几种算法以及优缺点
  • 【贪心算法】day6
  • CSS(展示效果)
  • 基于原神游戏物品系统小demo制作思路
  • docker,本地目录挂载
  • The Xilinx 7 series FPGAs 设计PCB 该选择绑定哪个bank引脚,约束引脚时如何定义引脚电平标准?
  • 算法:选择排序+堆排序
  • UE4/UE5反射系统动态注册机制解析
  • 【开题答辩全过程】以 汽车知名品牌信息管理系统为例,包含答辩的问题和答案
  • rabbitmq 的 TTL