推广 热搜: 广场  Java  app  Word  营业  微信公众号  北京代理记账  商城  代理记账  商标交易 

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

   2023-04-27 企业服务招财猫160
核心提示:hashmap实现了什么接口?Map表示映射,接口指定了一组由键值对组织的集合。键必须是唯一的,并且映射中的数据可以t被排序,即地图中数据的顺序与数据放置的顺序无关。,它的基本操作是get和put,也

hashmap实现了什么接口?

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

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

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

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

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

以下是对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新获取这些属性,并定义了两个新的属性,Entrybefore,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技术,其中很多都帮助了一些朋友!会继续分享,敬请关注。。。

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
合作伙伴
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  冀ICP备2023006999号-8