前言:
如今大家对“javamapvalue”大体比较注意,朋友们都需要分析一些“javamapvalue”的相关知识。那么小编同时在网摘上网罗了一些关于“javamapvalue””的相关内容,希望各位老铁们能喜欢,同学们一起来学习一下吧!遍历Map的value有几种方法,很大一部分人能直接答出来三种,真的是三种么?到这里可能有些朋友会说难道还有第四种?哈哈,没错就是三种,分别是先获取到key的Set:map.keySet(),然后通过key去获取value;直接获取到values集合的方法:map.values();以及最后的entrySet()方法。
Map<String,String> map = new HashMap<>();
Set<Map.Entry<String,String>> s = map.entrySet();
for (Entry<String, String> entry : s) {
entry.getKey();
entry.getValue();
}
今天给大家直接讲解一下entrySet()方法的内部实现。
首先找到了Map的内部,看到了这个方法的定义:
Set<Map.Entry<K, V>> entrySet();
通过此方法,直接可以发现Entry是Map的一个内部类或者内部接口,再往下看就发现Entry是Map内部直接封装的一个内部接口,且内部实现如下:
interface Entry<K,V> {
K getKey();
V getValue();
}
内部方法不多,不过我们主要看这两个方法,分别是获取key和获取value的方法。如果稍微对HashMap有一点了解的话,知道HashMap是基于链表数据结构实现的。不知道也没关系,我们可以去内部看一下:
打开HashMap内部实现后,发现其内部封装的有一个
transient Node<K,V>[] table;
那么很明显,Java基础部分大家都有学过Node,是一个节点对象,相对应的数据结构就是链表,那么一个链表类型的数组,这个数据结构就叫哈希表了。我们继续去看Node内部的实现:
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
Node(int hash, K key, V value, Node<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
public final K getKey() { return key; }
public final V getValue() { return value; }
public final String toString() { return key + "=" + value; }
public final int hashCode() {
return Objects.hashCode(key) ^ Objects.hashCode(value);
}
public final V setValue(V newValue) {
V oldValue = value;
value = newValue;
return oldValue;
}
}
可以很清晰的发现,Node对象是实现了Entry接口的,并且在重写的getKey和getValue方法中,获取到了存在根本的key和value值。
总结:说到底就是最终存放数据的Node类实现了Entry接口,并重写了Entry接口中的getKey和getValue方法,并将内部封装的数据通过这两个方法对外进行暴露,使外部可以进行访问。
磨砺营下一期班级12月15号正式开班啦,想跟着威哥学安卓的朋友关注微信公众号mjw-java或访问报名,期待你的加入
标签: #javamapvalue