您的位置:首页 > 编程语言 > Java开发

Java 集合 HashMap & HashSet 拾遗

2016-07-11 22:55 417 查看

Java 集合 HashMap & HashSet 拾遗

@author ixenos

摘要:HashMap内部结构分析

Java HashMap采用的是冲突链表方式



/**
* Returns <tt>true</tt> if this map maps one or more keys to the specified value.
* 即“如果这个映射表有一个或多个key映射到一个值上时,返回true”
* @param value value whose presence in this map is to be tested
* @return <tt>true</tt> if this map maps one or more keys to the
*         specified value
*/
public boolean containsValue(Object value) {
Node<K,V>[] tab; V v;
if ((tab = table) != null && size > 0) {
//遍历每一个桶bucket(同样hash值的entry(Node)在一个桶中),一个桶存放一个双链表
for (int i = 0; i < tab.length; ++i) {
//遍历桶中的链表,把所有映射value的key揪出来
for (Node<K,V> e = tab[i]; e != null; e = e.next) { //后继结点e.next指向的是另一个同hash的entry的前驱结点key(Node是双链表结点)
if ((v = e.value) == value ||
(value != null && value.equals(v)))
return true;
}
}
}
return false;
}


View Code

零碎知识

尽量返回接口而非实际的类型,如返回List、Set、Map而非ArrayList、HashSet、HashMap,便于更换数据结构,而客户端代码不用改变。这就是针对抽象编程

Map.entrySet 方法返回Map映射的 Set 视图Set<Map.Entry<K,V>>,维护entry键值对

该 set 受Map映射支持,所以对Map映射的更改可在此 set 中反映出来,反之亦然!

如果对该 set 进行迭代的同时修改了Map映射,外部modCount改变而内部的xxxmodCount还在自己的节奏(通过迭代器自己的 remove 操作,或者通过对迭代器返回的映射项执行 setValue 操作除外),则迭代结果是不确定的;简单来说就是iterator的对象不受Map支持,Map自行修改的时候不会通知到他,modCount异常,会发生如NullPointException之类的异常

该set 支持元素移除,通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear这几种操作操作可从映射中移除相应的映射关系,但它不支持 add 或 addAll 操作

欲深入理解HashMap可前往

skywang12345的博文:http://www.cnblogs.com/skywang12345/p/3310835.html#a21

chenssy的博文:http://www.cnblogs.com/chenssy/p/3521565.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: