了解Collection与Map的关系(HashMap与ConcurrentHashMap的加锁力度)等五小问

本文深入探讨JAVA数据结构,包括ArrayList与LinkedList的区别、HashMap与ConcurrentHashMap的加锁策略、LinkedHashMap的有序实现、TreeMap的有序性原理以及HashSet与LinkedHashSet的内部结构。内容涵盖集合类Collection和映射类Map的关键特性,帮助读者理解不同数据结构的适用场景和性能特点。

JAVA的数据结构

image-20230217172417534

所有JAVA的数据结构都是继承自Iterator类用来做迭代遍历,Iterator主要会区分开2种数据类型,第一种是集合类Collection,另一种是带映射关系的Map类,

关于Collection类,即使在无序不重复的Set中仍然可以分为无序的HashSet与强制进行排序的TreeSet,LinkedHashSet与TreeSet虽然都是有序但是排序方式是不同的,LinkedHashSet主要是依靠HashSet的插入顺序去排序的,而TreeSet主要是用我们插入对象的Object的Compare方法去做CompareTo的比较获得前后顺序。

1.ArrayList与LinkedList的区别

我相信学过数据结构的朋友都很熟悉,这是第一章的内容

ArrayList是内部以数组方式来实现的,是以一块完整连续是内存空间来实现的,LinkedList是内部以链表的方式进行实现的,如果进行读的操作,ArrayList的时间复杂度是O(1),因为只需要找到数组中的下标进行寻址即可,而LinkedList是依靠头结点依次遍历得到元素。所以时间复杂度是O(n)。若要进行删除和插入操作,则ArrayList要移动连续的元素,而LinkedLsit只需要做指针节点的改变即可满足要求,所以这样的操作他们的时间复杂度则恰好相反。

2.HashMap的内存结构,ConcurrentHashMap的加锁力度

HashMap的内存结构就是类似于桶状型的数组结构

image-20230218123025566

例如有6个槽位,当用户掉用put方法时HashMap会计算这个key的code,通过计算得哈希槽位,并将value填到数组的元素槽位当中 。

当key值重复时会发生哈希碰撞,在jdk1.8之前多出来的节点会变成链表的结构

image-20230218170206197

如果重复节点过多HashMap的读取操作会退化成链表的查询操作,大大影响查找效率,因此在1.8之后设置了链表阈值>=8,当大于8时链表会调整为红黑树,黑红树的查找时间复杂度为O(log n),保证查询效率。

阈值>= 8的原因:8为2的3次方,3个节点时效率最高,超过之后红黑树每次插入要调整得不偿失。

但是HashMap的结构线程是不安全,在对其进行插入或读取时是没加锁的,如果有两个并发的线程对HashMap做并发的操作往往会产生不可预知的效果。

因此在1.8之前ConcurrentHashMap进行了加锁的调整,例如有6个槽位,每3个槽位成一个分段segment1,每次操作都要获得锁才能操作操作厚重。

image-20230218172049604

1.8后摈弃segment结构,采用槽位管理,将加锁力度控制到最小,若需要进行写操作时,到相应槽位查看是否有锁,若有锁等待完成在操作。

3.LinkedHashMap的加工

由于HashMap遍历操作往往是无序性的。例如最后插入的value4可能是排在第一个。

image-20230218171315242

而LinkedHashMap的引入会利用节点的列表记录插入顺序,例如记入key的顺序,在用key指向对应的值达到保证遍历的有序性。

image-20230218172816968
4.TreeMap的有序性

TreeMap并不是使用HashMap中Hash槽来管理数据其本质上是是红黑树的结构,因此它使用JAVA Compare接口,实现每个对象比较大小的操作再进行红黑树的调整。

5.HashSet及LinkedHashSet的内部结构

Set主要是为了保持其无序不重复的特性,不用像List遍历查找值存在的问题。

进行HashSet的源码可以发现HashSet内部就是HashMap

image-20230219000019929

在进行add操作,会发现调用是put方法,若我们插入的对象e在我们HashMap的对象中存在则返回之前被替换对象的本身,若没有则返回null,这个方式成功与否完全取决了这个对象是否已经存在。

image-20230219000050668

而相应的LinkedHashSet、TreeSet都对标了LinkedHashMap、TreeMap。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值