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
相关文章推荐
- java的一路发展历程!
- java是一门有未来的语言!
- spring四种依赖注入方式 (set,构造器,工厂,注解 )
- SpringMvc的入门案例
- 归并排序-java实现
- JMX的Hello World
- JAVA设计模式之单例模式
- 【Spring】对象后期处理,BeanPostProcessor
- SpringMVC学习笔记
- JAVA异常处理机制
- Unsupported major.minor version 52.0问题的解决
- java里面的输入流、输出流、节点流和处理流区别
- String 与 int之间的转换
- eclipsecpp从可执行程序员中导入源代码并调试
- java集合——HahMap的用法
- Java Executors(线程池)
- Java 关于对象的思考
- Java正则表达式细节1
- Java - 如何进入阻塞状态
- java中ArrayList应用实例