集合{LinkedHashMap TreeMap HashSet LinkedHashSet TreeSet 快速失败机制 ConcurrentHashMap CAS 多线程协同扩容}(二)

HashMap的应用场景、优点与缺点 在许多Java应用程序中,HashMap是一种常见且实用的数据结构,它基于散列表(Hash Table)实现。HashMap提供了快速的插入、查找和删除操作,并且可以存储键值对形式的数据。接下来,我们将通过一个具体业务场景来详细讲解HashMap的应用场景、优点以及存在的一些缺点。 阅读详情

目录标题

LinkedHashMap

Map集合框架结构体系图

在这里插入图片描述

在这里插入图片描述

什么是LinkedHashMap
Linked 链式 的意思
HashMap “哈希映射”的意思
LinkedHashMap 链式哈希映射


它扩展自HashMap
并且 用双向链表来保证元素的顺序
Entry<K,V> before, after;
还记录了头节点和尾节点


在这里插入图片描述

重点
也就是说
它是有序的
HashMap是无序的
这也是它俩最大的区别


在这里插入图片描述

维护元素顺序的方式有两种
—种是“添加顺序”
—种是“访问顺序”



什么是“添加顺序”


添加顺序:
元素添加的顺序和取出的顺序一致


例如
我们依次添加
苹果 香蕉 梨子 葡萄 柠檬
取出的顺序:
从头节点开始
苹果 香蕉 梨子 葡萄 柠檬


在这里插入图片描述

练习

程序验证:
从执行结果来看
元素添加的顺序和取出的顺序一致


在这里插入图片描述

什么是访问顺序


什么是访问顺序:
被访问过的元素排在最后
通俗来讲
就是 get方法获取谁
谁就排到最后


在这里插入图片描述


举例:
如下图
我们获取了苹果
那么苹果就排到最后去
成为了尾节点
香蕉就自然成为了头节点
此时取出的顺序是
香蕉 梨子 葡萄 柠檬 苹果



在这里插入图片描述




通过accessorder属性
可以设置排序方式
false是添加顺序
true是访问顺序


在这里插入图片描述



LinkedHashMap一共有5个构造方法
其中有4个默认是false
只有一个构造方法
可以自主选择


在这里插入图片描述

验证访问顺序的代码
从执行结果来看
被访问的元素的确排在最后


练习

在这里插入图片描述

LinkedHashMap常用方法

LinkedHashMap 的常用方法有哪些
它既继承了HashMap
又实现了Map接口


在这里插入图片描述

所以
它拥有 Map和HashMap 里面的所有方法


Map方法分类和HashMap方法分类

在这里插入图片描述


但是在这些方法里面
只有八个方法是最常用的
其中
put和get方法用的最频繁


在这里插入图片描述

LinkedHashMap总结

在这里插入图片描述


它最大的优点是有序
这也是它和 HashMap最明显的区别、
在实际开发中
需要有序的Map集合时使用它


在这里插入图片描述

TreeMap集合

在这里插入图片描述

Map集合框架结构体系图

在这里插入图片描述

Tree 树的意思 这里的树 是指"二叉树"
Map "映射"的意思
TreeMap 二叉树映射的意思


重点!
可以看出来
它是以二叉树形式存储数据的
而且二叉树的类型是红黑树
红黑树拥有自平衡的特点
它会根据key进行排序


在这里插入图片描述

TreeMap 对key排序(红黑树的性质)


要了解排序过程
我们先要知道红黑树的五个性质
第一个性质
每个节点非黑即红
第二个性质
根节点是黑色
第三个性质
叶节点是黑色
第四个性质
每个红节点下的子节点是黑色
第五个性质
任意节点到叶节点的
每一条路径上的黑色节点数相同



在这里插入图片描述




我们向TreeMap集合中
依次添加E-A五个元素
最开始添加的是E
它是根节点 是黑色的
接下来添加的是D
它需要先跟E进行比较
结果小于 0 的话
放在E 的左边
并把它涂红
再接下来添加的是 C
它小于E
也小于D
放在D的左边
并把它涂红
此时 此时D和C两个父子节点都是红色
不满足红黑树性质四
每个红节点下的子节点是黑色
而D的子节点C 是红色



因此我们需要对其进行调整
先将C的父节点D 涂黑
然后再将C的祖父节点E 涂红
接着对E进行右旋
此时的红黑树
满足所有性质



再接下来添加的是B
它小于D 也小于C
放在C的左边
并把它涂红
此时C 和B 都是红色
同样不满足红黑树性质四
因此需要对其进行调整




先将B的父节点 C 涂黑
再将B的祖父节点D的右子节点E 也涂黑
此时的红黑树 满足所有性质



最后添加的是A
它小于D 也小于 C 也小于B
放在B的左边 并把它涂红
此时B和A都是红色
同样不满足红黑树性质四



因此需要对其进行调整
先将A的父节点 B 涂黑
再将A的祖父节点C 涂红
接着对C进行右旋
此时的红黑树
满足所有性质
到此 所有元素已经添加完毕



在这里插入图片描述

在这里插入图片描述

重点!
TreeMap遍历元素的方式
是中序遍历
先左节点
再根节点
最后右节点



在这里插入图片描述

练习

程序验证
从执行结果来看: 的确是中序遍历的方式
输出 A-E


在这里插入图片描述

TreeMap的特点 :无序

元素添加的顺序: 和取出的顺序不一致


在这里插入图片描述

TreeMap的特点 :key不可为null

重点!
我们在添加元素的地方
发现了 key 不可以为 null
如果为 null
则会抛出NullPointerException(空指针异常)


在这里插入图片描述

另外 null无法参与比较
由此我们可以总结出
TreeMap的第三个特点:
key不可为null



在这里插入图片描述

TreeMap的特点 :key唯一

我们在比较两个key的地方发现
当比较结果为 0 时
说明两个key相同
走else 分支
新值直接覆盖掉 旧值
由此我们可以总结出:
TreeMap的第四个特点:
key不可以重复
也就是key唯一



在这里插入图片描述

TreeMap的常用方法


重点!
TreeMap 实现了Map接口
还实现了NavigableMap接口
增强了搜索元素的能力
NavigableMap继承自SortedMap接口
让TreeMap有了排序的能力
最后:SortedMap继承 Map接口
拥有最基本的Map能力


在这里插入图片描述

综上所述
TreeMap拥有Map SortedMap NavigableMap
里面的所有方法


TreeMap拥有Map SortedMap NavigableMap所有方法

但是在这些方法里面
它只有九个方法是常用的


在这里插入图片描述

总结

在这里插入图片描述

重点!
在实际开发中
它是用的最频繁的容器之一
多用于需要对key排序的集合


在这里插入图片描述

HashSet集合

在这里插入图片描述

Collection集合框架结构体系图

在这里插入图片描述


Hash 散列 或者 "哈希"的意思
set 集合的意思
HashSet 哈希集合的意思
它内部用的是 HashMap 来储存数据



在这里插入图片描述

所以看出
为什么HashSet是无序集合
它的四个构造方法无一例外
全部都在初始化HashMap
也就是说
我们创建 HashSet
其实就是创建了一个HashMap



在这里插入图片描述

存数据的时候
只需要把 key 当 value使
value再用一个统一的值填充即可
这个值就定义在HashSet的内部
名叫“PRESENT”
是Object 类型



在这里插入图片描述
在这里插入图片描述


元素取出的顺序
如果是数组的话
从下标0 开始
如果是链表的话
从头节点开始
依次是
柠檬 苹果 香蕉 葡萄 梨子



在这里插入图片描述

练习


程序验证:
从执行结果来看 和我们刚刚说的顺序 一样
由此 我们可以总结出
HashSet的第一个特点:无序


在这里插入图片描述

元素存入的顺序和取出的顺序不一致


在这里插入图片描述

其他的特点以及优缺点
都和HashMap一样

在这里插入图片描述

HashSet 的常用方法

HashSet 实现了Set接口
拥有Set 里面的所有方法


但是在这些方法里面
它只有七个方法是最常用的
重点!!!
add和iterator方法用得最频繁



在这里插入图片描述

HashSet 与 HashMap 的区别

因为HashSet 内部用的就是HashMap
所以它俩只有一个区别
那就是 HashMap : key是key value是value
而 HashSet :把key当value 使用 value再用统一的值填充



在这里插入图片描述

总结:

介绍了 无序集合 HashSet

在这里插入图片描述

在实际开发中
它是用得最频繁的容器之一
多用于保存不重复的数据


在这里插入图片描述

LinkedHashSet

在这里插入图片描述

Collection集合框架结构体系图

在这里插入图片描述

Linked "链式"的意思
HashSet "哈希集合"的意思
LinkedHashSet :链式哈希集合
所以可以看出
它扩展自 HashSet
但它内部使用的是LinkedHashMap
LinkedHashMap是有序的




在这里插入图片描述

所以
LinkedHashSet 也是有序的
关于LinkedHashMap更多内容
在之前学过 就不介绍了
当我们使用LinkedHashSet存数据的时候
只需要把 key 当 value 使
value再用一个统一的值填充即可
这个值就定义在HashSet的内部



在这里插入图片描述

元素取出的顺序
从头节点开始
依次是 苹果 香蕉 梨子 葡萄 柠檬


在这里插入图片描述

练习

程序验证:
从执行结果来看
和我们刚刚说的顺序一样
由此
我们可以总结出
LinkedHashSet的第一个特点
有序




在这里插入图片描述

重点!
元素存入的顺序 和 取出的顺序 一致
其他的特点 及优缺点
都和 LinkedHashMap一样


在这里插入图片描述

LinkedHashSet 常用方法

LinkedHashSet继承自HashSet
实现了 Set接口


在这里插入图片描述

所以 : 它拥有Set HashSet 里面的所有方法
但是 在这些方法里面
它只有七个方法是最常用的
其中add和 iterator方法用得最频繁



Set方法分类 HashSet方法分类 LinkedHashSet 常用方法分类

在这里插入图片描述

LinkedHashSet 与 LinkedHashMap的区别



两者有两个区别
第一个区别: 存储方式的不同
LinkedHashMap : key是key value是 value
而 LinkedHashSet: 把key当 value 使用 value 再用统一的值填充


第二个区别是: 排序方式的不同
LinkedHashMap有两种不同的排序方式
一种是 : 添加顺序
一种是 : 访问顺序



而LinkedHashSet只有一种排序方式
那就是 添加顺序 也就是默认的取出顺序
这点大家需要注意!



总结:

本节介绍了LinkedHashSet
它的特点及 优缺点


在这里插入图片描述

重点!
在实际开发中
它是用的最频繁的容器之一
多用于保存不重复且有序的数据


在这里插入图片描述

TreeSet

在这里插入图片描述

Collection集合框架结构体系图

在这里插入图片描述

Tree “树"的意思 这里的树 是指"二叉树”
Set :"集合"的意思
TreeSet: 二叉树集合 的意思



它内部使用的是TreeMap
TreeMap是基于红黑树实现的
红黑树拥有自平衡的特点
它会对元素进行排序
默认的排序规则是自然排序
自然排序是通过元素的compareTo方法完成的
自定义排序则需要实现Comparator接口
遍历元素的方式 : 采取的是 中序遍历
先左节点 再根节点 最后右节点



在这里插入图片描述

在这里插入图片描述

练习


程序验证:
从执行结果来看
和我们刚刚说的顺序一样
由此
我们可以总结出
TreeSet的第一个特点:
无序


在这里插入图片描述

元素存入的顺序和取出的顺序不一致
其他的特点以及优缺点
都和TreeMap 一样
关于TreeMap 的学习内容在之前讲解过


在这里插入图片描述

TreeSet 常用方法

TreeSet继承自AbstractSet抽象类
实现了Set接口
TreeSet 还实现了NavigableSet接口
增强了搜索元素的能力
NavigableSet继承自SortedSet接口
让TreeSet有了排序的能力
最后
SortedSet继承自Set接口



TreeSet 结构体系图

在这里插入图片描述

所以
TreeSet 拥有 Set SortedSet
NavigableSet 里面的所有方法


Set方法分类 SortedSet方法分类 NavigableSet常用方法分类

在这里插入图片描述

但是这些方法中
它只有 八个 方法是最常用的
其中add和iterator方法用得最频繁


在这里插入图片描述

比较HashSet和LinkedHashSet




在实际开发中
HashSet LinkedHashSet TreeSet
之间该如何选择


HashSet的性能
基本上比 LinkedHashSet和TreeSet要好
特别是在 添加 和 查询 操作
而这两个操作也是用得最频繁的操作



LinkedHashSet查询稍慢一些
但它 可以维持 元素 添加的顺序
所以 只有当 需要 存入的顺序 和取出的顺序 一致 时
才应该使用LinkedHashSet



TreeSet只有在需要对元素进行排序时使用
所以以下是
三种Set集合各自的应用场景


在这里插入图片描述

总结 TreeSet

它的特点以及优缺点

在这里插入图片描述

在这里插入图片描述

在实际开发中
它是用的最频繁的容器 之一
多用于有排序需求的Set 场景



在这里插入图片描述

快速失败(fail-fast)机制

在这里插入图片描述

在集合中有一种保护机制
叫 fail-fast
翻译过来就是
fail-fast : 快速失败
它能够防止多个线程并发修改同一个容器的内容
如果发生了并发修改的情况
那么就会触发“快速失败”的机制



在这里插入图片描述

也就是抛出并发修改异常

在这里插入图片描述

例如
你在迭代遍历某个容器的过程中
另一个线程介入其中
并且插入或者删除此容器内的某个元素
那么就会出现问题
不光是多线程会出现问题
就连单线程也会出现问题



在这里插入图片描述



重点!
下面 通过一个过程
来复现以下问题是怎样产生的
试想一下
当我们的容器正在扩容时
突然有两个元素被添加进来
请问 : 它们该放在哪里



放在旧容器不合适
再者说 旧容器也容不下它们
只能放在新容器
2 号位 是梨子的
3 号位 是葡萄的
所以它们只能往后顺位
由于它们是同一时刻被添加进来的
导致它们计算的位置(下标)是一样的
这就产生了
同一个位置出现了两个元素的情况




在这里插入图片描述

重点!
问题也就显示了出来
为了防止这样的问题出现
Java容器类采用了快速失败(fail-fast)机制
它会监视容器的变化
具体的做法是
在容器类中
定义一个modCount 属性
用于记录 容器修改 次数
初始值为 0



在这里插入图片描述

只要容器有添加或删除元素的操作
modCount就 ++


在这里插入图片描述



在每次获取迭代器的时候
迭代器会先读取一次modCount的值
迭代的时候进行比较



如果两个值不相等
那么就说明有其他线程修改了容器
导致数据混乱
因此抛出并发修改异常
以上就是“快速失败(fail-fast)机制”的原
理



在这里插入图片描述

快速失败 解决方案


接下来 来看看如何避免上述问题
会发生上述问题的容器
说明它们都是线程不安全的
所以
只要采用对应的线程安全的容器即可



例如:
ConcurrentHashMap
CopyOnWriteArrayList
和 CopyOnWriteArraySet
都可以



在这里插入图片描述

拿CopyOnWriteArrayList举例来说
先创建一个CopyOnWriteArrayList集合
然后启动另一个线程来修改容器
往容器中添加数据
最后获取迭代器
遍历集合




在这里插入图片描述

执行程序:
从执行结果来看
程序没有发生异常
并打印出了刚刚添加的数据


在这里插入图片描述

说明使用线程安全的容器类
可以避免并发修改的问题


在这里插入图片描述

总结

介绍了 快速失败 fail-fast 机制
它的原理和解决方案
在实际面试中
它和容器 通常一起问
重点掌握和理解



在这里插入图片描述

在这里插入图片描述

ConcurrentHashMap

使用线程安全的容器类
能保证我们的数据安全
消除并发修改的隐患



在这里插入图片描述

作为对应HashMap安全版本的
ConcurrentHashMap
它不仅是常用的容器之一
而且还经常出现在面试中



被问到最多的是
一: 同步
ConcurrentHashMap的实现原理是什么


在这里插入图片描述

ConcurrentHashMap的实现原理是什么
了解原理 我们要查看它的源码
它的源码非常复杂



在这里插入图片描述

ConcurrentHashMap
并没有简单粗暴地
直接给整个数组加锁
因为这样同一时刻
只能有一个线程操作数组
导致操作其他位置的线程只能等待
虽然数据是安全的
但是效率是极低的



在这里插入图片描述
在这里插入图片描述

所以设计者建议
给数组中每个头节点加锁
这样一来
并发度就从原来的 1
增长到 16
理论上 数组有多长 并发度就有多少
并发度上去了
效率也随之提高了



在这里插入图片描述

在并发数较大的环境下
不能再只用一个属性
来统计元素的个数
原因是
多个线程会同时读取属性的值
然后对其 ++
在同时赋给属性
这样一来就产生了线程安全问题
明明有多个线程对其 ++
结果确为 1




在这里插入图片描述

为了解决这个线程安全问题
我们给它加上锁
问题是解决了
但刚刚提升的效率
又给降下来了
获取锁 释放锁
耗时耗资源


在这里插入图片描述

在这里插入图片描述

重点!
于是 设计者采用
比锁轻量的CAS



在这里插入图片描述

Compare And Swap

Compare And Swap 的意思是 比较并交换


在这里插入图片描述

CAS 在多线程系列教程的出现过
使用CAS更新属性时
同一时刻 也只有一个线程能更新成功
其余线程更新失败



在这里插入图片描述

更新失败的线程再无限循环更新
直到更新成功
这看起来和锁没什么区别
效率也没高到哪里去



于是
设计者又提出 不妨新增一个数组
让更新失败的线程
先把值累加到
数组中去
在此之前
各个线程需要先知道
自己累加的位置(下标)



位置的计算方式
是和HashMap一样的
取一个随机数
当作是哈希值
然后&(数组长度-1)
这个操作
等同于 与数组长度取余



在这里插入图片描述

得到的余数
就是要累加的位置(下标)
累加失败的线程再循环累加
直到累加成功
最终元素个数
是由单个属性
和数组共同累计



在这里插入图片描述



从源码中我们也可以看到
元素最终个数
就是由
单个属性 baseCount
和CounterCell[]
共同累计来的



在这里插入图片描述

CounterCell[初始容量为2
扩容后的容量是原来的二倍



谈到扩容
ConcurrentHashMap和 HashMap是不同的



在这里插入图片描述

多线程协同扩容

ConcurrentHashMap 采用的是多线程协同扩容
怎么协同
从后往前
每个线程负责一段数据的迁移工作



在这里插入图片描述

一段有多长呢
这段代码
就是在计算一段有多长
n 是数组长度
stride 步长的意思
这里记录就是
每段的长度



NCPU 指你电脑上可用的核心线程数有多少
如果没超过 1 的话
那么步长 就为数组的长度
负责整个数组的数据迁移工作



如果超过 1 的话
那么就先让n 右移 3 位
也就是除以 8
然后再除以可用的核心线程数



在这里插入图片描述



例如 假设
数组长度 16
可用核心线程数 为 2
那么这里计算的步长就是
16/8/2=1



在这里插入图片描述

这个值小于最小步长数16

在这里插入图片描述

所以每个线程 至少要负责 16 个元素的迁移工作
迁移后的位置
会被填充ForwardingNode




在这里插入图片描述

ForwardingNode是一个哈希值为-1
key、value都为null的节点
其实它就是一个标识
表示该位置的节点已经迁移
或者正在迁移



在这里插入图片描述

在这里插入图片描述

key、value不能为null



ConcurrentHashMap的key和 value是都不能为null的
大致原因是:
当我们通过key获取到一个值为null的value时
你无法辨别 这到底是key 不存在呢
还是它所对应的值为null呢
有争议性



在这里插入图片描述

所以
设计者干脆就不让 key和value为null
这点 是与HashMap不同的




ConcurrentHashMap 与 HashMap的区别



第一: 线程是否安全方面
HashMap 是线程不安全的
ConcurrentHashMap是线程安全的


第二 : 扩容方面
HashMap 是单线程扩容
扩容过程中
如果其他线程 添加或删除集合中某个元素
还会引发并发修改异常


ConcurrentHashMap则没有此类问题
它是多线程协同扩容
安全又高效



第三 :统计元素个数方面
HashMap用一个属性来记录
ConcurrentHashMap则因为多线程的缘故
采用基础属性 baseCount 和 CounterCell 数组
累加计数




第四 : key value 能否为 null 方面
HashMap 能
ConcurrentHashMap不能 更为严谨一些




在这里插入图片描述

ConcurrentHashMap的常用方法


ConcurrentHashMap 继承自AbstractMap抽象类
实现了 Map接口
还实现了 ConcurrentMap 接口
ConcurrentMap继承自Map接口



在这里插入图片描述

ConcurrentHashMap 拥有Map 和ConcurrentMap里面的所有方法



但是在这些方法里面
它只有八个方法是常用的
其中
put和get 方法用得最频繁



在这里插入图片描述

总结(线程安全容器类)

本节介绍了 线程安全容器类

在这里插入图片描述

在实际开发中
它是用的最频繁的容器之一
多用于缓存数据
在面试中
也经常被问到


在这里插入图片描述

在这里插入图片描述

为什么ConcurrentHashMap只需给头节点加锁

为什么ConcurrentHashMap只需给头节点加锁
就可以保证线程安全了呢



在这里插入图片描述

换一种方式理解
不是给所有元素都加锁
这样不是更安全吗?



在这里插入图片描述

首先
ConcurrentHashMap只针对位置加锁
它不针对具体元素 加锁



在这里插入图片描述

头节点 之所以成为被锁对象
是因为头节点正好就在数组位置上
它下面的节点都是链在它的身后



另外
头节点不是固定不变的
例如 把"苹果" 删了
“香蕉” 就成为了头节点
此时 锁的就是 “香蕉”
足以证明
ConcurrentHashMap只针对位置加锁
不针对 具体元素 加锁
位置上是谁
就对谁加锁



在这里插入图片描述

另外 增删改查都是通过头节点进行的
例如 增加一个 “西瓜”
它先计算自己在数组中的位置(下标)
然后找到对应位置上的元素
即头节点
然后根据头节点的next 属性
依次往下走
找到合适的位置 插在尾部



在这里插入图片描述

删除 修改 查找
都是一样的道理
所有只要入口 每次只进一个线程
就可以保证数据的安全
因此
ConcurrentHashMap只需给头节点加锁就可以了



在这里插入图片描述

总结本节内容

本节解释了
ConcurrentHashMap
为什么只需给头节点 加锁?



在这里插入图片描述
这些内容有可能出现面试中
总结的Q&A 图


Java集合容器面试题(2026版) 序列号 内容 链接 1 Java基础知识面试题(2022版) https://blog.youkuaiyun.com/qq_43061290/article/details/124023797 2 Java集合容器面试题(2022版) 待续… https://editor.youkuaiyun.com/md?spm=1001.2101.3001.5352&articleId=124043363 3 Java异常面试题(2022版) 待续… 4 并发编程面试题 (2022版) 待续… 5 JV.... 阅读详情

相关推荐

RiteLinked - Rust 中的 LinkedHashMap 和 LinkedHashSet

RiteLinked——类似HashMap的容器,以用户可控的顺序保存它们的键值对RiteLinked提供了LinkedHashMap和LinkedHashSet更多最新版本。您可以在std或no_std环境中轻松使用它。一些实用的功能组合,支持,帮助您更好地将其嵌入到现有代码:serde ,inline-more等。特别是,它使用griddle在默认情况下,如果你有大量的数据,它可以有效帮助你减少可能的尾巴延迟。(当然也可以用hashbrown )用法将ritelinked添加到Cargo.toml :ritelinked =" x.y.z"写一些这样的代码:letmut lru_cache= LinkedHashMap::new ();let key="key" .to_owned ();let _cached_val= lru_cache .raw_entry_mut () .from_key (& key) .or_insert_with (|| (key.clone (),42 ));信用它是流行的 cratehashlink 的一个分支

Rust学习笔记 5.2 HashMap

HashMap的键可以是布尔型、整型、字符串,或者任意实现了Eq和Hashtrait的其他类型。HashMap由链表加数组组成,它的底层结构是一个数组,而数组的元素是一个单向链表。HashMap也是可增长的,但HashMap在占据了多余空间时还可以缩小自己。...

Star_tears的博客 780

【SeedLab】Packet Sniffing and Spoofing Lab

本节实验要求:借助Scapy库,实现网络流量的捕获与伪造。

cold_windx的博客 4517

Rust学习总结之HashMap

Rust学习总结之Hashmap,最全的总结

ftzchina的博客 3174

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1096

WSL 2 部署 Rocky Linux 9:从零到生产环境配置指南(2025版)

本文详细介绍了如何在WSL 2上部署Rocky Linux 9,从环境准备到生产环境配置的全流程指南。通过优化安装流程和系统配置,帮助开发者和运维工程师在Windows环境下高效运行企业级Linux系统,特别适合需要本地开发但部署到RHEL系服务器的项目。

weixin_28455801的博客 479

多线程下使用HashMap

多线程下使用HashMap 如果在被问及:“HashMap是否线程安全,如何线程安全地使用HashMap?”,你会如何回答,以前的话我会这样回答:“HashMap是非线程安全的,如果要保证线程安全的话,就需要使用Hashtable。”但是经过最近的学习,我又了解到了ConcurrentHashMap和SyschronizedMap,其实这个问题的本质就是:HashMap、Hashtable、ConcurrentHashMap、SyschronizedMap的原理与区别。接下来我就总结一下的我的学习成果: 1

轻狂書生的博客 9538

再相逢【知识图谱】中文医学知识图谱CMeKG,中文产科医学知识图谱COKG | 附:图数据库Neo4j下载安装教学(遇到问题并解决) + Neo4j基本操作

本篇文章介绍知识图谱的相关知识。从便于理解的角度切入,给出知识图谱的形象化定义,并介绍了国内的中文医学知识图谱CMeKG,还以用户视角体验了中文产科医学知识图谱。目录二介绍了如何部署安装Neo4j数据库,并解决了部署过程中遇到的一些基础错误,随后介绍了Neo4j图数据库的基础操作。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 2619

Java集合2025热门八股文

本文整理了Java集合框架的核心知识点,重点解析了HashMap的实现原理和优化技巧。HashMap采用数组+链表+红黑树结构,通过哈希函数和扩容机制(默认容量16,负载因子0.75)实现高效存储。对比了不同集合类的特性:ArrayList与LinkedList的性能差异,HashSet与HashMap的关系,以及线程安全集合如ConcurrentHashMap、CopyOnWriteArrayList的实现原理。特别分析了JDK1.8对HashMap的优化,包括红黑树、哈希函数改进和扩容机制调整。

m0_72965836的博客 1671

SAP 调用Ftp服务器

FTP(File transfer protocol)是一种标准的网络协议,可以用于在互联网上传递文件。SAP系统中可通过系列配置和提供的些标准函数,用于查看、更新、下载FTP服务器上的文件。提示:以下是本篇文章正文内容,下面案例可供参考。

qq_38304013的博客 1418

【unity游戏开发入门到精通——UGUI】UI控件 —— Image图像控件

【unity游戏开发入门到精通——UGUI】UI控件 —— Image图像控件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2361

Java集合框架实战指南:从数据结构到并发编程的深度解析

数据结构是计算机科学的核心基础,它研究数据的组织、存储和操作方式。在Java开发中,集合框架将经典数据结构如数组、链表、哈希表、红黑树等封装为易用的API,其底层原理直接决定了程序的时间复杂度和空间复杂度。理解这些原理,能帮助开发者编写出更高效、更健壮的代码,避免性能瓶颈和并发问题。集合框架的技术价值在于,它不仅是存储数据的容器,更是实现算法优化、资源管理和并发控制的关键组件。在实际应用场景中,无论是实现高速缓存、任务队列,还是处理海量数据去重、维护有序集合,都需要根据具体需求选择合适的集合类型。例如,Ar

weixin_30896511的博客 313

基于STM32设计的盲人智能导盲杖

本设计基于STM32单片机,开发了一种面向视障人群的智能导盲杖系统。系统以STM32F103C8T6为核心控制器,集成了超声波测距、语音提示、环境光检测、GPS定位及4G通信等多种功能模块。

650

Java集合框架深度解析:从底层原理到实战选型指南

在Java编程中,数据结构是构建高效应用的核心基础。集合框架通过提供标准化的接口与实现分离设计,将算法与数据结构解耦,实现了代码的高复用性与可维护性。其核心价值在于为动态数据管理提供了高性能、类型安全的解决方案,广泛应用于数据处理、缓存系统和业务逻辑编排等场景。本文聚焦ArrayList与HashMap这两个高频使用的实现类,深入剖析其动态数组扩容与哈希表冲突解决机制,并结合线程安全、迭代器快速失败等工程实践要点,为开发者提供从原理到选型的完整知识图谱。

weixin_30376083的博客 409

C#面试题及详细答案120道(61-75)-- 多线程与异步

本文摘要了前后端面试题中关于线程与并发的核心知识点,包括线程与进程的区别(61题)、Thread/ThreadPool/Task的对比(62题)、线程安全实现方法(63题)、lock关键字的原理(64题)、Monitor类的进阶用法(65题)以及死锁的成因与避免(66题)。通过C#代码示例和表格对比,清晰展示了多线程编程的关键概念、应用场景及常见问题解决方案,适合开发者快速掌握面试高频考点。完整内容可访问专栏目录获取更多技术面试题解析。

大剑师兰特的GIS世界 1432

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java集合框架深度解析:从数据结构到实战应用

在Java编程中,集合框架是管理对象组的基础工具,其核心原理基于不同的数据结构实现。例如,ArrayList基于动态数组,支持快速随机访问;HashMap则利用哈希表实现高效的键值对存储。理解这些底层数据结构的工作原理,对于优化程序性能至关重要。集合框架的技术价值在于提供了统一、高效的API,能够应对各种数据管理需求,如去重、排序和并发访问。在实际应用场景中,开发者需要根据具体需求选择合适的集合类型,例如在需要快速查找时使用HashSet,在需要保持插入顺序时使用LinkedHashMap。本文通过分析Ar

weixin_34409357的博客 342

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java集合框架:Map与Set核心原理与性能优化

Map和Set是Java集合框架中的两大核心接口,分别用于存储键值对和唯一元素集合。从数据结构角度看,Map基于哈希表或红黑树实现快速查找,而Set则利用Map的特性确保元素唯一性。Java 8对HashMap进行了重大优化,引入红黑树解决哈希冲突,将最坏情况时间复杂度从O(n)降至O(log n)。在实际工程中,正确选择Map/Set实现类对系统性能影响巨大:HashMap适合通用场景,TreeMap提供排序功能,ConcurrentHashMap则是高并发环境的首选。理解其底层实现原理能帮助开发者避免常

weixin_33770878的博客 403

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java集合框架深度解析:从数据结构到并发实战

数据结构是计算机科学的核心基础,它定义了数据的组织、存储和访问方式,直接影响程序的性能和资源消耗。在Java生态中,集合框架是对常用数据结构(如数组、链表、树、哈希表)的标准化实现,其设计原理深刻体现了数据结构与算法的权衡。理解集合的底层实现,例如ArrayList的动态数组扩容、HashMap的哈希冲突解决与红黑树优化,不仅能提升代码效率,更是排查性能瓶颈和并发问题的关键。这些技术价值在高并发、大数据处理等应用场景中尤为突出。本文聚焦Java面试中的高频考点,深入剖析ArrayList与LinkedLis

weixin_33720956的博客 364

集合框架 (六)

Java集合框架是存储和操作数据的核心工具,分为单列集合Collection和双列集合Map两大体系。Collection包括List(有序可重复)、Set(无序不重复)和Queue(队列);Map存储键值对,Key唯一。常用实现类有ArrayList、LinkedList、HashSet、HashMap等,各有特点:ArrayList基于动态数组查询快,LinkedList基于链表增删快,HashSet去重,HashMap键值映射高效。集合提供了丰富的API和遍历方式,支持泛型保证类型安全。开发中需注意线

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 241

Java数据结构

因为可能线程 2 在线程 1 调用 map.contains(key) 时,删除了 key,这样就会导致线程 1 得到的结果不明确,产生多线程安全问题,因此,ConcurrentHashMap 的 key 和 value 不能为 null。1️⃣底层实现:数组➕链表(红黑树),扩容为2倍,扩容后重新分布,当链表长度大于8且数组长度大于64时,链表转红黑树,当链表长度小于6时,红黑树转链表。1️⃣底层实现:双向链表结构,实现list接口,物理空间可不连续,无大小限制。

Dave_Fong的博客 622

Java集合框架核心解析:List、Set、Map实现原理与面试要点

Java集合框架是开发中最常用的基础组件之一,其核心包含List、Set、Map三大接口体系。从数据结构角度看,ArrayList基于动态数组实现随机访问,LinkedList采用双向链表优化插入删除,HashSet依赖哈希表保障元素唯一性,TreeMap通过红黑树维护键值有序性。这些容器类的不同实现方式直接影响程序性能,例如ArrayList的O(1)随机访问特性适合订单流水场景,而HashSet的O(1)包含检查能力则适用于商品去重等操作。在Java技术面试中,83%的面试会考察集合框架,重点包括底层实

weixin_34162228的博客 361

java面试题:集合

面试题目

你是人间四月天 214

Java集合框架深度解析:从数据结构原理到高并发实战与面试要点

数据结构是计算机科学的核心基础,它定义了数据的组织、存储和访问方式。在Java生态中,集合框架是对常用数据结构(如动态数组、链表、哈希表、树)的标准化实现,其设计深刻体现了时间与空间的权衡原理。掌握集合框架的技术价值在于,开发者能够根据数据规模、访问模式(读多写少或频繁增删)和并发需求,做出精准的技术选型,从而编写出高性能、高可维护性的代码。这在构建高并发服务、实现高效缓存以及处理大规模数据等应用场景中至关重要。例如,理解HashMap从链表到红黑树的进化,是为了应对哈希冲突导致的性能退化;而Concurr

weixin_30595035的博客 418

Java: 集合

具体来说,

Co_Hui的博客 520

Java集合框架深度解析:从数据结构到并发编程的40道核心面试题

在Java开发中,数据结构是构建高效、健壮应用的基石。集合框架作为Java核心API,封装了数组、链表、哈希表、树等经典数据结构,提供了统一的操作接口。其设计哲学在于通过抽象(如Collection、Map接口)与迭代器模式,实现了数据存储与遍历的解耦。理解其底层原理,如HashMap的哈希计算、扩容机制与红黑树优化,对于编写高性能代码至关重要。在并发场景下,快速失败(Fail-Fast)与安全失败(Fail-Safe)机制揭示了线程安全的不同实现路径,而ConcurrentHashMap的锁粒度细化与Co

weixin_30924239的博客 516

JAVA集合学习

实现类底层结构有序性线程安全null时间复杂度HashSetHashMap❌❌✅O(1)插入顺序❌✅O(1)TreeSetTreeMap排序❌❌O(log n)排序✅❌O(log n)

qq_62425694的博客 450
上一篇: 集合{Collection集合 迭代器 ArrayList集合 LinkedList集合 HashMap集合 }(一)
下一篇: IO流{文件和目录 File 字符如何储存在电脑上 字节输入流 字节输出流 read方法读的字节为什么返回int类型}(一)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值