Java学习打卡-Day19-Set、HashSet、LinkedHashSet

devtools/2025/3/21 19:28:59/

Set 接口

  • 无序(添加和取出顺序不一致)(但取出顺序固定)。
  • 没有索引。
  • 不允许重复,所以最多一个null
  • 遍历方式
    1. 迭代器
    2. 增强for循环
    3. 不能使用普通for循环索引方式。

HashSet

  • 实现了Set接口,具有相应特征。
  • 底层实际是HashMap,HashMap底层是数组+链表/红黑树
  • add()方法会返回一个boolean值,表示添加成功/失败。
    java">	Set set = new HashSet();set.add("Lucy");set.add("Lucy");//Falseset.add(new Dog ("tom"));set.add(new Dog ("tom"));//True。//由于 Dog 类没有重写 equals 和 hashCode 方法,//这两个 Dog 对象会被认为是不同的对象,因此这个 Dog 对象也会被添加到 set 中。set.add(new String("hsp"));set.add(new String("hsp"));//False//再次添加一个新的 String 对象,虽然它是通过 new String("hsp") 创建的,//但 String 类重写了 equals 和 hashCode 方法,因此这两个 String 对象被认为是相同的,不会被重复添加。
    
  • HashSet 不允许重复元素,判断重复的依据是 equals 和 hashCode 方法。
HashSet 添加元素底层实现
  1. 先得到元素Hash值,转换成数组索引值。
  2. 找到table数组的索引位置有无元素。
  3. 没有则直接加入;有则调用equals方法比较,相同则放弃添加,不同则与下一个链接的元素比较···
HashSet 扩容机制与树化机制
  1. 首次添加元素,table扩容至16。临界值threshold=加载因子loadFactor(0.75)*16=12。
  2. 如果元素个数达到临界值12,则table扩容两倍为32。 此时临界值threshold=加载因子loadFactor(0.75)*32=24·····
  3. 如果一条链表的元素个数达到8,并且table大小达到64,则该链表将进行树化。否则仍采用扩容机制

LinkedHashSet

  • 继承了HashSet,实现了Set接口,具有相应特征。
  • 添加和取出顺序一致咯。
  • 底层实际是LinkedHashMap,LinkedHashMap底层是数组+双向链表
  • 双向链表有head和tail,每一个节点有pre和next。
  • 数组是HashMap$Node[],存放的元素是LinkedHashMap$Entry类型。

http://www.ppmy.cn/devtools/168650.html

相关文章

Java 集合框架

一、引言 在 Java 编程中,集合是一种非常重要的数据结构,它可以用来存储和管理一组对象。Java 集合框架提供了一套丰富的接口和类,用于处理不同类型的集合,如列表、集合、映射等。通过使用集合框架,开发者可以更高效地处理数据,提高代码的可维护性和可扩展性。 二、Jav…

WEB攻防-PHP反序列化-字符串逃逸

目录 前置知识 字符串逃逸-减少 字符串逃逸-增多 前置知识 1.PHP 在反序列化时,语法是以 ; 作为字段的分隔,以 } 作为结尾,在结束符}之后的任何内容不会影响反序列化的后的结果 class people{ public $namelili; public $age20; } var_du…

跨系统投屏:Realme手机(远程)投屏到Linux系统的简单方法

家里长辈年纪上来了,有点老花眼,平常看手机总是觉得字体不够大,还一个劲儿地将手机拿很远。其实那台手机的字体已经调到最大了。 为了让长辈刷手机的时候可以轻松快乐一点,我们帮他将手机投屏到电脑上。毕竟电脑屏幕比手机大多了&…

正则表达式(可用于MySQL、C++、Python)

正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于描述文本模式的字符串。它通过特定的语法规则,允许你匹配、搜索和操作字符串中的内容。 正则表达式可以用来: 匹配文本:可以在字符串中查…

【Linux】浅谈环境变量和进程地址空间

一、环境变量 基本概念 环境变量(Environment Variables)是操作系统提供的一种机制,用于存储和传递配置信息、系统参数、用户偏好设置等。 环境变量的作用 配置程序行为: 程序可以通过环境变量获取配置信息,例如日…

13-动态规划-最长公共子序列

题目 来源 24. 最长公共子序列 思路 不想打字&#xff0c;援引自最长公共子序列 (LCS) 详解例题模板&#xff08;全&#xff09;-CSDN博客 图示举例&#xff1a; 其余详见代码 代码 #include<bits/stdc.h> using namespace std; const int N110; int f[N][N]; int m…

每日一题----------文件流(创建文件方式三种)

创建文件对象相关构造器和方法&#xff1a; &#xff08;1&#xff09;new File&#xff08;String pathname&#xff09;//根据路径构建一个file对象。 &#xff08;2&#xff09;new File(File parent,String child)//根据父目录文件&#xff0b;子路径构建。 &#xff08…

Java 中 Vector 的底层数据结构及相关分析

1. Vector的底层数据结构 Vector 是 Java 早期提供的动态数组实现&#xff0c;底层基于 Object 数组(Object[] elementData) 进行存储。它的核心数据结构类似于 ArrayList&#xff0c;但 Vector 是线程安全的&#xff0c;通过 synchronized 关键字实现同步。 2. 实现原理 (1)…