概要

这一章,我们对HashMap进行学习。
我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap。内容包括:
第1部分 HashMap介绍
第2部分 HashMap数据结构
第3部分 HashMap源码解析(基于JDK1.6.0_45)
    第3.1部分 HashMap的“拉链法”相关内容
    第3.2部分 HashMap的构造函数
    第3.3部分 HashMap的主要对外接口
    第3.4部分 HashMap实现的Cloneable接口
    第3.5部分 HashMap实现的Serializable接口
第4部分 HashMap遍历方式
第5部分 HashMap示例

转载请注明出处:http://www.cnblogs.com/skywang12345/p/3310835.html

第1部分 HashMap介绍

HashMap简介

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。

HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。容量 是哈希表中桶的数量,初始容量 只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
通常,默认加载因子是 0.75, 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。

HashMap的构造函数

HashMap共有4个构造函数,如下:

// 默认构造函数。
HashMap() // 指定“容量大小”的构造函数
HashMap(int capacity) // 指定“容量大小”和“加载因子”的构造函数
HashMap(int capacity, float loadFactor) // 包含“子Map”的构造函数
HashMap(Map<? extends K, ? extends V> map)

HashMap的API

void                 clear()
Object clone()
boolean containsKey(Object key)
boolean containsValue(Object value)
Set<Entry<K, V>> entrySet()
V get(Object key)
boolean isEmpty()
Set<K> keySet()
V put(K key, V value)
void putAll(Map<? extends K, ? extends V> map)
V remove(Object key)
int size()
Collection<V> values()

第2部分 HashMap数据结构

HashMap的继承关系

java.lang.Object
↳ java.util.AbstractMap<K, V>
↳ java.util.HashMap<K, V> public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable { }

HashMap与Map关系如下图

从图中可以看出: 
(01) HashMap继承于AbstractMap类,实现了Map接口。Map是"key-value键值对"接口,AbstractMap实现了"键值对"的通用函数接口。 
(02) HashMap是通过"拉链法"实现的哈希表。它包括几个重要的成员变量:table, size, threshold, loadFactor, modCount。
  table是一个Entry[]数组类型,而Entry实际上就是一个单向链表。哈希表的"key-value键值对"都是存储在Entry数组中的。 
  size是HashMap的大小,它是HashMap保存的键值对的数量。 
  threshold是HashMap的阈值,用于判断是否需要调整HashMap的容量。threshold的值="容量*加载因子",当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。
  loadFactor就是加载因子。 
  modCount是用来实现fail-fast机制的。

第3部分 HashMap源码解析

为了更了解HashMap的原理,下面对HashMap源码代码作出分析。
在阅读源码时,建议参考后面的说明来建立对HashMap的整体认识,这样更容易理解HashMap。

http://www.cnblogs.com/chengdabelief/p/7419776.html

第4部分 HashMap遍历方式

4.1 遍历HashMap的键值对

第一步:根据entrySet()获取HashMap的“键值对”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

// 假设map是HashMap对象
// map中的key是String类型,value是Integer类型
Integer integ = null;
Iterator iter = map.entrySet().iterator(); //entrySet()返回set
while(iter.hasNext()) {
//获取Map.entry类型的键值对
Map.Entry entry = (Map.Entry)iter.next();
// 获取key
key = (String)entry.getKey();
// 获取value
integ = (Integer)entry.getValue();
}

4.2 遍历HashMap的键

第一步:根据keySet()获取HashMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

// 假设map是HashMap对象
// map中的key是String类型,value是Integer类型
String key = null;
Integer integ = null;
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
// 获取key
key = (String)iter.next();
// 根据key,获取value
integ = (Integer)map.get(key);
}

4.3 遍历HashMap的值

第一步:根据value()获取HashMap的“值”的集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

// 假设map是HashMap对象
// map中的key是String类型,value是Integer类型
Integer value = null;
Collection c = map.values();
Iterator iter= c.iterator();
while (iter.hasNext()) {
value = (Integer)iter.next();
}

最新文章

  1. 利用exp/imp备份恢复数据库实例
  2. IE11兼容性问题修改
  3. tcp连接listen的backlog剖析
  4. python 连接redis工具类
  5. Sublime Text 2 安装emmet插件和常用快捷键
  6. 如何用Jquery实现 ,比如点击图片之后 ,该图片变成向下的箭头,再点击向下箭头的图片 又变成原始图片呢
  7. Word2013对公式处理:样式、自动编号、交叉引用
  8. Spring和CXF整合时报Unsupported major.minor version 51.0异常
  9. Java爬虫,信息抓取的实现(转)
  10. Django rest framework 自定义Exception
  11. java调取数据库
  12. [译]移动API安全终极指南
  13. css3的动画特效--动画序列(animation)
  14. java的System.getProperty()获取的值
  15. .NET 并行计算和并发10-lock锁
  16. springcloud 入门 11 (Hystrix Dashboard)
  17. win8和win7下解决php5.3和5.4、5.5等不能加载php_curl.dll的终极解决办法 收藏
  18. eclipse项目环境搭建(做了好多遍,老是忘记,以此文帮助记忆)
  19. 抛弃百度UMEditor,拥抱summernote (解决上传文件又慢又卡的问题)
  20. 让node支持es模块化(export、import)的方法

热门文章

  1. Codeforces 263B. Appleman and Card Game
  2. [luoguP2863] [USACO06JAN]牛的舞会The Cow Prom(Tarjan)
  3. 6、Java并发性和多线程-并发性与并行性
  4. SiteMesh2-sitemesh.xml的ParameterDecoratorMapper映射器的用法
  5. Angularjs中添加HighCharts
  6. 问答:怎样规划CSS 中 的命名方式 怎样看待 CSS 中 BEM 的命名方式?
  7. iOS推断当前控制器是否在显示
  8. 热烈庆祝国产编程语言R++1.8研发成功
  9. UVA 10555 - Dead Fraction(数论+无限循环小数)
  10. #HDU 3790 最短路径问题 【Dijkstra入门题】