全网最好的Java集合总结

IMG_877D7B358073-1.jpeg

1.List (有序、可重复)

1.1 ArrayList

底层是一个Object[],在不指定容量的时候,会进行懒加载,创建一个{}对象,然后在add的时候创建一个容量为10的Object[],当数组容量不够的时候会扩容,每次扩容为原来的1.5倍。

1.2 Vector

相当于一个 sync版本的ArrayList

1.3 LinkedList

LinkedList内部就是一个双向链表,非常适合数据动态的插入和删除,但是随机访问和遍历速度很慢。

  1. 为什么内部类node是静态的? 如果普通内部类会持有外部类的引用,可能会造成内存泄漏(也就是说外部类不用了但是回收不了
  2. LinkedList不但能够做一个普通list,同时还能做队列,栈。 队列的入队出队方法为 **offer、poll方法,**栈的入栈和出栈方法为 push、pop方法

## 2. Set (唯一) Set注重独一无二的性质,该体系集合用于存储无序,**值不相同的元素。**对象相等性本质就是hashcode值。

2.1 HashSet

HashSet底层就是一个HashMap,就是在HashMap的基础上利用key不能相等,然后分hash桶,然后链化,只是entry中的value就是写死的一个Object 常量对象

  • 1个对象来了,首先判断hashcode值是不是一样的,如果一样,再判断equals是不是一样,如果都一样,HashSet就认为这是一个对象
  • 如果hashcode值一样,但是equal返回false,那就链化,把它放到链表上去

2.3 TreeSet

TreeSet使用二叉树的原理完成排序过程。

  • Integer和String对象都可以进行默认的TreeSet排序,但是自定义类对象是不可以的,自定义的类必须实现Comparable接口,并重写compareTo函数。

2.4 LinkedHashSet

搞懂LinkedHashMap就行

3. Map

3.1 HashMap

  • 1.7 的HashMap
    • 数组+链表
    • 链表插入为头插法 (为什么使用头插法?考虑到热点数据的原因,最近插入的元素可能最近会被使用到)
    • 先扩容然后再添加元素(先判断是否需要扩容->数量达到阈值并且发生hash冲突,如果需要扩容就扩容,再添加元素)size >= threshold && null != table[bucketIndex]

image.png

  • 1.7 put方法的流程

    1. 通过key计算一个hashCode,然后定位到哪个桶 (hash算法:位运算,寻址算法:取模)
    2. 把put进来key、value封装成一个entry对象,判断下标位置是否为空,如果为空,直接插入,如果不为空,把entry插入到链表中
    3. 在插入链表的时候,判断链表是否存在相同的key(equals),如果存在,则更新,如果不存在,就插入
    4. 使用头插法,也就是说每次插入到头节点上
  • 1.7 扩容

    • 扩容条件:达到阈值并且发生hash冲突(比如说大小为16,负载为0.75,阈值就是12,map中已经有12个元素,然后再加入一个元素的时候发生冲突了,就需要扩容了)
    • 扩容过程:根据每个元素的hashCode值结合新数组的长度,重新计算下表来达到分散的作用
  • 1.7 多线程出现的问题

    • jdk7存在多线程做put操作的时候导致rehash动作,可能导致循环链表的产生,然后再来一个线程get,就死循环了
    • jdk8存在put到相同槽位但是没有追加到链表尾部,而是直接覆盖的问题
  • 1.8 的HashMap

    • 新增了红黑树,使用数组+链表+红黑树
    • 链表插入为尾插法
    • 先添加元素然后扩容 (先添加元素进去,然后判断是否需要扩容-> 数量超过了阈值)

image.png

  • 1.8 put方法的流程
    1. 通过key计算一个hashCode,然后定位到哪个桶 (jdk8对于hash算法和寻址算法是如何优化?hash算法优化:hashcode32位,右移16位,然后高16位和低16位做异或运算,寻址优化:原来是取模,现在改成hash&(n-1), 效果和取模是一样的,但是性能更高)
    2. 把put进来key、value封装成一个entry对象,判断下标位置是否为空,如果为空,直接插入,如果不为空,把entry插入到链表中
    3. 在插入链表的时候,判断链表是否存在相同的key(equals),如果存在,则更新,如果不存在,就插入
    4. jdk7的时候,使用的是头插法,jdk8的时候,使用的尾插法
    5. 如果是jdk8,会遍历链表,如果链表的个数大于8个,则会把链表转为红黑树,并且把元素插入到红黑树中
  • 链表转红黑树条件
    • 链表的个数 >8个
    • 同时也会去判断数组长度是不是 > 64,为什么? 因为在解决hash冲突的时候,既可以使用链化,也可以使用扩容,如果长度还不是很长的时候,优先扩容。
  • 1.8 扩容流程
    1. 新申请2倍的一个数组长度,然后开始把链表或者红黑树开始转移
    2. jdk7简单的遍历链表上的每一个元素,**然后根据每个元素的hashcode值然后结合新数组的长度 **重新计算一个新的下标来达到分散的作用
    3. jdk8因为红黑树的存在,在转移的时候,会考虑到红黑树元素由于分散之后,是不是要回到链表的状态,所以会用一个双向链表来记录红黑树上面的元素,遍历双向链表,得到2个子链,一个是在原位置,一个在新位置(原位置+ 扩容长度,比如原来位置是2,从16->32,那新位置就是18),长度>8转成红黑树放到对应位置,<8把链表放到对应位置
  • 1.8 多线程安全

还是会存在数据覆盖的问题

3.2 HashTable

相当于sync版本的HashMap

3.3 TreeMap (红黑树)

TreeMap实现了SortedMap,能够把它保存的记录根据键排序,默认是按照键值的升序排序。在使用TreeMap时,key 必须实现 Comparable接口或者在构造TreeMap传入自定义的 Comparator。

3.4 LinkedHashMap

既想要存入entry,又想要有序,这时候就使用LinkedHashMap

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现线程同步的几种方式

线程同步 1. 线程同步概念 线程同步是指多个线程协调它们的执行顺序&#xff0c;以确保它们正确、安全地访问共享资源。在并发编程中&#xff0c;当多个线程同时访问共享数据或资源时&#xff0c;可能会导致竞争条件&#xff08;Race Condition&#xff09;和其他并发问题 所…

【Python基础】一文搞懂:Python 中 csv 文件的写入与读取

文章目录 1 引言2 CSV 文件简介3 Python 中的 csv 模块4 写入 CSV 文件4.1 基本用法4.2 高级用法 5 读取 CSV 文件5.1 基本用法5.2 高级用法 6 实例演示7 注意事项8 总结 1 引言 在数据处理和数据分析领域&#xff0c;CSV (逗号分隔值) 文件是一种常见的文件格式&#xff0c;用…

Day31 贪心算法 part01 理论基础 455.分发饼干 376.摆动序列 53.最大子序和

贪心算法 part01 理论基础 455.分发饼干 376.摆动序列 53.最大子序和 理论基础&#xff08;转载自代码随想录&#xff09; 什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 这么说有点抽象&#xff0c;来举一个例子&#xff1a; 例如&#…

Qt QProgressBar进度条控件

文章目录 1 属性和方法1.1 值1.2 方向1.3 外观1.4 信号和槽 2 实例2.1 布局2.2 代码实现 QProgressBar是进度条控件&#xff0c;进度条用来指示任务的完成情况 1 属性和方法 QProgressBar有很多属性&#xff0c;完整的可查看帮助文档。这里以QProgressBar为例&#xff0c;列出…

小马识途:十个营销故事 启发营销思路

在营销过程中&#xff0c;优势是相对的&#xff0c;只有凭借着客观的营销环境创造优势才能够取胜市场。在企业营销中&#xff0c;狗猛酒酸的案例比比皆是。接下来&#xff0c;就与小马识途一起来看看十个经典的营销故事吧&#xff01; 一、摩托车公司 有家德国摩托车公司&…

【Python学习】Python学习13-日期和时间

目录 【Python学习】Python学习13-日期和时间 前言通过time 获取时间戳时间元组获取当前时间&#xff0c;格式化时间格式化时间转换python中时间日期格式化符号获取日历Time 模块日历&#xff08;Calendar&#xff09;模块其他模块参考 文章所属专区 Python学习 前言 本章节主…

Sublime Text:提升编码效率的强大代码编辑器

Sublime Text是一款被广大开发者称赞的强大代码编辑器。它以其简洁、高效的设计和功能&#xff0c;成为了众多程序员的首选工具。 Sublime Text的界面简洁大方&#xff0c;没有繁琐的菜单和工具栏&#xff0c;让用户能够专注于代码编写。无论是在Windows、macOS还是Linux操作系…

1 月 21 日,三件事儿,线上不见不散丨社区活动

1 月 21 日&#xff0c;三件事儿&#xff0c;线上不见不散&#xff1a; RTE 开发者社区&#xff0c;三位联合主理人正式亮相&#xff0c;分享对于行业、社区与开发者人才发展的思考&#xff1b;「实时互动行业人才洞察2024」正式发布&#xff0c;关于行业、人才与生态的分析与…

生骨肉冻干推荐测评|希喂、VE、百利、PR等多款热门生骨肉冻干测评

随着养猫的观念逐渐科学化&#xff0c;越来越多的铲屎官开始关注猫咪主食的健康和营养问题。 冻干因其模拟猫咪原始捕猎猎物模型配比、低温加工的特点&#xff0c;被认为是最符合猫咪饮食天性的选择。 相比传统的膨化猫粮&#xff0c;生骨肉冻干中的淀粉和碳水化合物添加较少…

【论文笔记】ZOO: Zeroth Order Optimization

论文&#xff08;标题写不下了&#xff09;&#xff1a; 《ZOO: Zeroth Order Optimization Based Black-box Attacks to Deep Neural Networks without Training Substitute Models》 Abstract 深度神经网络(DNN)是当今时代最突出的技术之一&#xff0c;在许多机器学习任务中…

常用机床类型的用途和介绍

随着市场对机加工需求的提升&#xff0c;机械加工的技术精度也随之提高&#xff0c;机床的种类也就越来越多。 根据加工方法和使用的工具进行分类&#xff0c;国家将机床编制为11类&#xff1a;车床、钻床、镗床、磨床、齿轮加工机床、螺纹加工机床、铣床、刨床、拔床、锯床等…

【网络安全】【密码学】常见数据加(解)密算法及Python实现(二)、椭圆曲线密码ECC

本文介绍椭圆曲线密码及其Python实现。 一、实验目的 1、 掌握椭圆曲线上的点间四则运算和常见的椭圆曲线密码算法&#xff1b; 2、 了解基于ECC的伪随机数生成算法和基于椭圆曲线的商用密码算法。 二、算法原理 1、算法简介 椭圆曲线密码学&#xff08;Elliptic Curve Cr…

conda环境下Torch not compiled with CUDA enabled解决方法

1 问题描述 在运行wav2lip模型训练时&#xff0c;报如下错误&#xff1a; Traceback (most recent call last):File "D:\ml\Wav2Lip\preprocess.py", line 32, in <module>fa [face_detection.FaceAlignment(face_detection.LandmarksType._2D, flip_inputF…

[Oracle][详细] Win完全卸载Oracle

前提准备 进入服务 找到Oracle开头的服务 将这些服务全部停止 Top 1 点击开始菜单找到Oracle,然后点击Oracle安装产品,再点击【Universal Installer】 Top 2 点击之后稍等一会然后会进入进入下图界面,点击卸载产品 Top 3 选中要删除的Oracle产品,然后点击【删除】 Top 4 进…

清晰讲解Cookie、Session、Token、JWT之间的区别

文章目录 什么是认证(Authentication)什么是授权(Authorization)什么是凭证(Credentials)什么是Cookie什么是SessionSession的痛点 Cookie 和 Session 的区别什么是Token(令牌)Acesss TokenRefresh Token Token 和 Session 的区别Token 与 Cookie什么是 JWT生成JWTJWT 的原理JW…

指导AI进行推理:提示工程如何弥补RAG系统中的差距

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research) 原文标题:Instructing AI to Reason: How Prompt Engineering Bridges the Gap in RAG Systems 原文地址:https://medium.c…

ROS---激光雷达的使用

ROS—激光雷达的使用 激光雷达是现今机器人尤其是无人车领域及最重要、最关键也是最常见的传感器之一&#xff0c;是机器人感知外界的一种重要手段。本文将介绍在ROS下使用激光雷达传感器&#xff0c;我们选用的激光雷达型号为思岚A1。 使用流程如下: 硬件准备&#xff1b;软…

如何给字符串字段添加索引

MySQL是支持前缀索引的&#xff0c;可以定义字符串的一部分作为索引&#xff0c;如果创建索引的语句不指定前缀长度&#xff0c;那么索引就会包含整个字符串。 alter table SUser add index index1(email);alter table SUser add index index2(email(6)); 如上两个创建索引的语…

openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题

文章目录 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题194.1 分析查询语句长时间运行的问题194.1.1 问题现象194.1.2 原因分析194.1.3 处理办法 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时…

【python入门】day24:千年虫问题、京东购物流程、根据星座测试性格特点

千年虫 yList[82,17,73,56,84,0,99] print(原列表&#xff1a;,yList) for index,val in enumerate(yList):yList[index]2000 if val0 else 1900 print(更改后列表&#xff1a;,yList) yList.sort() print(排序后列表&#xff1a;,yList)enumerate的作用&#xff1a;会把列表中…