龙空技术网

程序开发中Map的value方法详解

磨砺营IT教育 501

前言:

如今大家对“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