博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Map,Map.Entry<K,V>源码分析
阅读量:7114 次
发布时间:2019-06-28

本文共 2663 字,大约阅读时间需要 8 分钟。

hot3.png

一、简单介绍。

1、Map是java中的接口,Map.Entry是Map的一个内部接口。

2、Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。

3、Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。

二、源码分析。

Map源码(包含Entry的定义):

package java.util;public interface Map
{ int size(); boolean isEmpty(); boolean containsKey(Object key); boolean containsValue(Object value); V get(Object key); V put(K key, V value); V remove(Object key); void clear(); Set
keySet(); Collection
values(); Set
> entrySet(); interface Entry
{ K getKey(); V getValue(); V setValue(V value); boolean equals(Object o); int hashCode(); } boolean equals(Object o); int hashCode();}

由源码可知:

1、Entry为Map内部的一个泛型接口,Entry的泛型决定了Map可以存哪些类型的数据。

再来看HashMap源码中的一段代码:

static class Entry
implements Map.Entry
{ final K key; V value; Entry
next; final int hash; Entry(int h, K k, V v, Entry
n) { value = v; next = n; key = k; hash = h; } public final K getKey() { return key; } public final V getValue() { return value; } public final V setValue(V newValue) { V oldValue = value; value = newValue; return oldValue; } public final boolean equals(Object o) { if (!(o instanceof Map.Entry)) return false; Map.Entry e = (Map.Entry)o; Object k1 = getKey(); Object k2 = e.getKey(); if (k1 == k2 || (k1 != null && k1.equals(k2))) { Object v1 = getValue(); Object v2 = e.getValue(); if (v1 == v2 || (v1 != null && v1.equals(v2))) return true; } return false; } public final int hashCode() { return (key==null ? 0 : key.hashCode()) ^ (value==null ? 0 : value.hashCode()); } public final String toString() { return getKey() + "=" + getValue(); } void recordAccess(HashMap
m) { } void recordRemoval(HashMap
m) { } }

由以上两段源码可以看出:

1、Entry其实是一个链表。

2、我们往HashMap中put值的时候,值其实是存在Entry里面的。key和value分别会赋值到Entry的key和value中。

3、Entry中还有一个字段叫 final int hash;存取这个Entry的hash值。这个hash值是最终找数据的关键。

由以上可知,Entry对象才是HashMap的核心,存取了数据以及数据的唯一编号hash。

转载于:https://my.oschina.net/weiweiblog/blog/612965

你可能感兴趣的文章
后端开发面经
查看>>
使用Envoy 作Sidecar Proxy的微服务模式-3.分布式追踪
查看>>
焦虑、不安
查看>>
this是什么以及如何判断它
查看>>
【Go】string 优化误区及建议
查看>>
Perseus-BERT——业内性能极致优化的BERT训练方案【阿里云弹性人工智能】
查看>>
酷狗音乐快速转换MP3格式的方法
查看>>
原生JS 实现复杂对象深拷贝(对象值包含函数)
查看>>
优化体系结构 - 算法外置优化计算结构
查看>>
你应该知道的数据库数据类型及其设计原则
查看>>
解决vue报错Failed to mount component
查看>>
[LeetCode] 124. Binary Tree Maximum Path Sum
查看>>
活学活用! 用Local Storage实现多人聊天室
查看>>
一次爬虫实践记录
查看>>
炫酷粒子表白,双十一脱单靠它了!
查看>>
mysql锁以及实践总结
查看>>
【工具】MongoDB 与可视化工具 adminMongo 的安装、启动与连接
查看>>
Javascript--常用方法
查看>>
Swoft之服务注册发现Consul服务器配置
查看>>
[译]迁移到新的 React Context Api
查看>>