集合框架(三)

Set集合

特点

Set系列集合特点:

        无序:添加数据的顺序和获取出的数据顺序不一致;无重复;无索引;

  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:排序、不重复、无索引

注意:

        Set要用到的常用方法,基本就是Collection提供的!

        自己几乎没有额外新增一些常用功能!

HashSet集合的底层原理

注意:再正式了解HashSet集合的底层原理前,我们需要先搞清楚一个前置知识:哈希值!

哈希值

  • 就是一个int类型的数值,Java中每个对象都有一个哈希值。
  • Java中的所有对象,都可以调用Object类提供的hashCode方法,返回该对象自己的哈希值。

对象哈希值的特点 

  • 同一对象多次调用hashCode()方法返回的哈希值是相同的。
  • 不同的对象,它们的哈希值一般不相同,但也可能相同(哈希碰撞)。

底层原理

  • 基于哈希表实现的。
  • 哈希表说一致增删改查数据,性能都较好的数据结构。

哈希表

哈希表是一种增删改查数据性能都叫较好的结构。

  • JDK8之前,哈希表 = 数组+链表
  • JDK8开始,哈希表 = 数组+链表+红黑树
JDK8之前HashSet集合的底层原理,基于哈希表:数组+链表
  1. 创建一个默认长度16的数组,默认加载因子为0.75,数组名table
  2. 使用元素的哈希值数组的长度求余计算出因存入的位置
  3. 判断当前位置是否为null,如果是null直接存入
  4. 如果不为null,表示有元素,则用equals方法比较。相等,则不存;不相等,则存入数组
  • JDK8之前,新元素存入数组,占老元素位置,老元素挂下面
  • JDK8开始之后,新元素直接挂再老元素下面
JDK8开始HashSet集合的底层原理,基于哈希表:数组+链表+红黑树

JDK8开始,当链表长度超过8,且数组菜单>=64时,自动将链表转成红黑树

小结:JDK8开始后,哈希表中引用了红黑树之后,进一步提高了操作数据的性能。 

了解一些数据结构(树)
  • 红黑树,就是可以自平衡的二叉树
  • 红黑树是一种增删改查数据性能相对都较好的结构

深入理解HashSet集合去重复机制

        HashSet集合默认不能对内容一样的两个不同对象去重复

比如内容一样的两个学生对象存入到HashSet集合中去,HashSet集合是不能去重复的

如何让HashSet集合能够实现对内容一样的两个不同对象去重复?

        结论:如果希望Set集合认为2个内容一样的对象是重复的,必须重新对象的hashCode()和equals()方法

LinkefHashSet集合的底层原理

  • 依然是基于哈希表(数组、链表、红黑树)实现的。
  • 但是,它的每个元素都额外的多了一个双链表的机制记录它前后元素的位置。

TreeSet集合

  • 特点:不重复、无索引、可排序(默认升序排序,按照元素的大小,由小到大排序)
  • 底层是基于红黑树实现的排序。

 注意:

  • 对于数值类型:Intger,Double,默认按照数值本身的大小进行升序排序。
  • 对于字符串类型:默认按照首字符的编号升序排序。
  • 对于自定义类型如Student对象,TreeSet默认是无法直接排序的。

自定义排序规则

  • TreeSet集合存储自定义类型的对象时,必须指定排序规则,支持如下两种方法来指定比较规则。
方式一
  • 让自定义的类(如学生类)实现Comparable接口,重新里面的compareTo方法来指定比较规则。
方式二
  • 通过调用TreeSet集合由参数构造器,可以设置Comparator对象(比较器对象,用于指定比较规则)。

注意:如果类本身由实现Comparable接口,TreeSet集合同时也自带比较器,默认使用集合自带的比较器排序。 

Collection集合的总结

1、如果希望记住元素的添加顺序,需要存储重复的元素,又要频繁的根据索引查询数据?

  • 用ArrayList集合(有序、可重复、有索引),底层基于数值的(常用)

2、如果希望记住元素的添加顺序,且增删首尾数据的情况较多?

  • 用LinkedList集合(有序、可重复、有索引),底层基于双链表实现的

3、如果不在意元素顺序,也没有重复元素需要存储,只希望增删改查都快?

  • 用HashSet集合(无序、不重复、无索引),底层基于哈希表实现的(常用)

4、如果希望记住元素的添加顺序,也没有重复元素需要存储,其希望增删改查都快?

  • 用LinkedSet集合(有序、不重复、无索引),底层基于哈希表实现和双链表

5、如果要对元素进行排序,也没有重复元素需要存储?且希望增删改查都快?

  • 用TreeSet集合,基于红黑树实现

注意事项:集合的并发修改异常问题

集合的并发修改异常

  • 使用迭代器遍历集合时,又同时再删除集合中的数据,查询就会出现并发修改异常的错误
  • 由于增强for循环遍历集合就是迭代器遍历集合的简化写法,因此,使用for循环遍历集合,又在同时删除集合中的数据时,程序也会出现并发修改异常的错误

怎么保证遍历集合同时删除数据时不出bug?

  • 使用迭代器遍历集合,但用迭代器自己的删除方法删除数据即可
  • 如果能用for循环遍历时:可以倒着遍历并删除;或者从前往后遍历,但删除元素后做 i-- 操作
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class Test {public static void main(String[] args) {// 需求:删除集合中带“李”字的名字List<String> list = new ArrayList<>();list.add("王麻子");list.add("小李子");list.add("李爱花");list.add("张全蛋");list.add("李晓");System.out.println(list);//        for (int i = 0; i < list.size() ; i++) {
//            String name = list.get(i);
//            if (name.contains("李")){
//                list.remove(name);
//                i--;
//            }
//        }Iterator<String> it = list.iterator();while (it.hasNext()){String name = it.next();if (name.contains("李")){//list.remove(name);  并发修改异常的错误it.remove();}}System.out.println(list);}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/418177.html

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

相关文章

git提交代码到远端仓库的方法详解

一、何为git git就是版本控制器&#xff0c;就比如说你新建了一个git文件夹&#xff0c;里面用于存放你的C语言实习报告&#xff0c;现在要用git对该文件夹进行接管。当你修改了你的C语言实习报告点击保存之后&#xff0c;就用git的相关命令&#xff0c;提交给git&#xff0c;让…

第二百七十八回

文章目录 1. 概念介绍2. 使用方法2.1 DropdownMenu2.1 DropdownMenuEntry 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何禁止页面跟随手机自动旋转"相关的内容&#xff0c;本章回中将介绍DropdownMenu组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.…

NAT实验

一&#xff1a;实验要求 二&#xff1a;实验分析 拓扑图 三&#xff1a;实验配置 1&#xff1a;路由器配置 R1配置IP R2配置IP 2&#xff1a;缺省路由 查看路由表 3&#xff1a;端口映射 4&#xff1a;pc、HTTP配置 5:DNS、client配置 四&#xff1a;实验结果 pc可以ping…

AUTOSAR实战篇:基于ETAS工具链集成Infineon FEE模块

AUTOSAR实战篇&#xff1a;基于ETAS工具链集成Infineon FEE模块 前言 小T出品&#xff0c;必是精品&#xff01; 手把手带你集成Infineon FEE模块&#xff0c;你值得拥有! 正文 FEE全称为“Flash EEPROM Emulation ” , 即通过Flash来模拟EEPROM操作&#xff0c;相比Flash&…

Vue + JS + tauri 开发一个简单的PC端桌面应用程序

Vue JS tauri 开发一个简单的PC端桌面应用程序 文章目录 Vue JS tauri 开发一个简单的PC端桌面应用程序1. 环境准备1.1 安装 Microsoft Visual Studio C 生成工具[^2]1.2 安装 Rust[^3] 2. 使用 vite 打包工具创建一个 vue 应用2.1 使用Vite创建前端Vue项目2.2 更改Vite打包…

【数据结构】C语言实现共享栈

共享栈的C语言实现 导言一、共享栈1.1 共享栈的初始化1.2 共享栈的判空1.3 共享栈的入栈1.3.1 空指针1.3.2 满栈1.3.3 入栈空间错误1.3.4 正常入栈1.3.5 小结 1.4 共享栈的查找1.5 共享栈的出栈1.6 共享栈的销毁 二、共享栈的实现演示结语 导言 大家好&#xff0c;很高兴又和大…

自己是如何使用单元测试

前言 自己是如何使用单元测试 进行单元测试能够让我们在编写方法的具体实现代码后&#xff0c;能清晰地看到其是否能实现预期的功能&#xff0c;有助于我们及时修正自己方法中存在的bug&#xff0c;以免在后续使用到某方法时出现意想不到的错误。 一、引入单元测试所使用的依赖…

初识VUE

文章目录 Vue是什么1.创建一个Vue实例2.插值表达式{{ }}3.Vue的响应式特性4.开发者工具的安装 Vue是什么 概念&#xff1a;Vue是一个用于构建用户界面的渐进式框架 ①构建用户界面&#xff1a;基于数据渲染出用户看到的界面 ②渐进式&#xff1a;循序渐进 ③ 框架&#xff1…

【核心复现】基于改进鲸鱼优化算法的微网系统能量优化管理matlab

目录 一、主要内容 1 冷热电联供型微网系统 2 长短期记忆网络(Long Short Term Memory, LSTM) 3 改进鲸鱼优化算法 二、部分代码 三、运行结果 四、下载链接 一、主要内容 该程序为《基于改进鲸鱼优化算法的微网系统能量优化管理》matlab代码&#xff0c;主要内容如下&…

stm32 FOC系列 直流有刷控制原理

1、直流有刷驱动板 使用三极管搭建的简易 H 桥电路&#xff0c;如图 5.3.1 所示&#xff1a; 图 5.3.1 是使用三极管搭建的简易 H 桥电路&#xff0c;其中 MOTOR 表示直流有刷电机&#xff0c; Q1、 Q2、 Q3 和 Q4 为 4 个三极管&#xff0c;其中 Q1 和 Q3 接在了电源正极&…

【学习记录】Ouster雷达运行fastlio提示 Failed to find match for field ‘ring‘ 的解决办法

本文仅用于个人记录。 在使用ouster雷达运行fastlio代码时&#xff0c;提示 Failed to find match for field ‘ring’ 但ouster雷达确实是发布了ring信息&#xff0c;可以从启动的rviz里面看到包括ring。 进一步检查&#xff0c;发现ouster对ring的定义是 uint_16t&#xf…

多维表格产品vika多维表、Flowus、Wolai体验记录

昨天从下午6点肝到凌晨2点多体验低代码平台多维表格产品&#xff0c;体验了3个国内产品&#xff0c;vika多维表、Flowus、Wolai。 具有多维表格新型关系数据库的鼻祖是 Airtable&#xff0c;国内模仿产品有vika多维表、飞书多维表格等。 还有一种类型就是以在国内鼎鼎大名的N…