2016 - 2024

感恩一路有你

hashmap怎么删除某个value hashmap实现了什么接口?

浏览量:4534 时间:2023-04-06 20:32:46 作者:采采

hashmap实现了什么接口?

Map表示映射,接口指定了一组由键值对组织的集合。键必须是唯一的,并且映射中的数据可以 t被排序,即地图中数据的顺序与数据放置的顺序无关。,它的基本操作是get和put,也就是put数据和fetch数据,我们通常通过按键得到它对应的valu

LinkdHashSet底层怎么实现元素有序?

从源代码角度追根究底LinkedHashSet!

首先看看LinkedHashSet类中的所有方法,发现都只是一些构造方法,没什么特别的。。spliterator方法只是一个迭代器!

从构造函数中的超级方法点可以看出,构造函数中的父构造函数使用了LinkedHashMap进行实例化,因此LinkedHashSet的特性必然与LinkedHashMap密切相关,换句话说,LinkedHashSet的输出顺序来自于Linked HashMap

以下是对LinkedHashMap的详细分析:

LinkedHashMap继承HashMap并实现Map。显然LinkedHashMap也被认为是HashMap,保留了数组链表的结构。至于顺序的原因,肯定不会是因为Map接口和继承HashMap,也就是说LinkedHashMap的顺序肯定是在LinkedHashMap类中实现的。

Hashmap的底层数据结构是将数组中的位置作为桶,在每个桶中放一个链表(或者红黑树)。但是,hashCode落入的桶是不确定的,没有相关性,所以HashMap可以 t以有序的输出,而LinkedHashMap使用的是双链表形式。存储在Map中的数据不仅使用链表来维护每个桶中的顺序,还维护每个值中的顺序。

借个图,如下:

而且LinkedHashMap有两种迭代,一种是按插入顺序排序(迭代时像队列),另一种是按访问排序(像栈一样,最后一次访问放在栈头,可以实现为LRU)。

下面分析主要的源代码:

1、先看LinkedHashMap中的内部类条目:

Entry继承自一个键值结构,比如Node对象中的hash、key和值,next用作hashMap中的同一个bucket。表面的条目指向,LinkedHashMap.entry新获取这些属性,并定义了两个新的属性,Entry before,after,用来维护所有条目的一个点,成为一个双向链表。

其余的内部类,如LinkedKeyIterator和LinkedEntrySet,用作迭代器。

2、看LinkedHashMap中的属性:

LinkedHashMap中的主要属性有三个heads,tail(维护链表的头尾,很好理解),注释accessOrder写的很清楚,即访问顺序为真,插入顺序为假;

3,LinkedHashMap中的方法:①,put方法:我绕过LinkedHashMap,没有 找不到put方法。是用的HashMap的put方法吗?那条目链表是怎么做的呢?

从HashMap中的put方法可以看出,计算完哈希值后调用putVal方法,生成新插入的元素时使用newNode方法。LinkedHashMap不重写put方法,但重写newNode方法。从代码中,我们可以看到HashMap中的newNode方法。只是简单的new返回一个节点,LinkedHashMap中的newNode方法不仅添加了对象,还调用了linkNodeLast将对象挂在链表的尾节点上形成链表。(顺便可以看出jdk中的数据结构将多态特性(重写后调用子类方法)运用的淋漓尽致)

和newNode方法类似的还有一个newTreeNode方法,也是在HashMap中的put方法中调用的,也就是红黑树结构;

(2)、获取方法:

从get方法可以看出,如果accessOrder为false,那么LinkedHashMap使用的get方法与HashMap相同,计算对应的哈希值,比较键值(,等于),如果匹配则返回。如果accessOrder为真,则调用afterNodeAccess方法判断各种情况,然后将这个值设置为tail,保证是栈头的位置,下次会先找到。代码截图如上!

(3)、拆卸方法:

LinkedHashMap中的remove方法和HashMap中的一样,只是HashMap中最后一个afterNodeRemoval方法的方法体是空的,而在l。InkedHashMap被重写,这个节点的最后一个节点连接到前一个节点,相当于解耦。。代码如下:

一般来说,LinkedHashMap相比HashMap增加了链表特性,保持了元素的顺序。虽然大多数方法使用HashMap方法,但是在LinkedHashMap中重写的多态特性是以不同的实现的。可以说这是我们在开发代码时应该学习的,以后可以通过重写一些方法来扩展其他类型的HashMap!

LinkedHashMap说到这里,作者已经分享了很多java技术,其中很多都帮助了一些朋友!会继续分享,敬请关注。。。

LinkedHashMap 方法 链表 HashMap 顺序

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。