特性

* 允许null作为key/value。
* 不保证按照插入的顺序输出。使用hash构造的映射一般来讲是无序的。
* 非线程安全。
* 内部原理与Hashtable类似。
源码简要分析
public class HashMap<K,V>
{static final int DEFAULT_INITIAL_CAPACITY = 16 ; // 默认初始容量是16。(必须是2的次方)static final int MAXIMUM_CAPACITY = 1 << 30 ; // 即2的30次方static final float DEFAULT_LOAD_FACTOR = 0.75f; // 默认装载因子Entry[] table;  // Entry表int size; // Entry[]实际存储的Entry个数int threshold; // reash的阈值,=capacity * load factorfinal float loadFactor;// 构造函数public HashMap(int initialCapacity, float loadFactor) {// 找到一个比initialCapacity大的最小的2的次方数int capacity = 1;while (capacity < initialCapacity)capacity <<= 1;}this.loadFactor = loadFactor;threshold = (int)(capacity * loadFactor);table = new Entry[capacity];// addEntry()void addEntry(int hash, K key, V value, int bucketIndex) {Entry<K,V> e = table[bucketIndex];table[bucketIndex] = new Entry<>(hash, key, value, e);if (size++ >= threshold)resize(2 * table.length);}// put():添加元素public V put(K key, V value) {int hash = hash(key.hashCode());     // key的hash值int i = indexFor(hash,table.length);     // 槽位// 寻找是否已经有key存在,如果已经存在,使用新值覆盖旧值,返回旧值for (Entry<K,V> e = table[i]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {V oldValue = e.value;e.value = value;return oldValue;}}// 添加EntryaddEntry(hash,key,value,i);return null;}// resize():重新哈希void resize(int newCapacity) {Entry[] oldTable = table;int oldCapacity = oldTable.length;Entry[] newTable = new Entry[newCapacity];transfer(newTable);table = newTable;threshold = (int)(newCapacity * loadFactor);}/*** Transfers all entries from current table to newTable.*/void transfer(Entry[] newTable) {Entry[] src = table;int newCapacity = newTable.length;for (int j = 0; j < src.length; j++) {Entry<K,V> e = src[j];if (e != null) {src[j] = null;     do {Entry<K,V> next = e.next;int i = indexFor(e.hash, newCapacity);e.next = newTable[i];newTable[i] = e;e = next;} while (e != null);}}}}

  

遍历方式

* 低效遍历:按照Key进行遍历,则每次都需要按Key查找槽位(不同的Key有重复查找),且可能需要遍历槽位上所在Entry链表(不同的Key有重复遍历)。
* 高效遍历:HashMap的entrySet()返回自定义的EntryIterator,是先按照槽位遍历一次,再遍历一次槽位上Entry链表。
Map<String, String[]> paraMap = new HashMap<String, String[]>();
for( Map.Entry<String, String[]> entry : paraMap.entrySet() )
{String appFieldDefId = entry.getKey();String[] values = entry.getValue();
}

  

转载于:https://www.cnblogs.com/caca/p/java_hashmap.html

[Java] HashMap 源码简要分析相关推荐

  1. 搞懂 Java HashMap 源码

    HashMap 源码分析 前几篇分析了 ArrayList , LinkedList ,Vector ,Stack List 集合的源码,Java 容器除了包含 List 集合外还包含着 Set 和 ...

  2. RxJava Agera 从源码简要分析基本调用流程(2)

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文由晋中望原创文章,转载请注明出处:  文章原文链接:https://www.qcloud.com/communi ...

  3. HashMap 源码深度分析

    HashMap 源码分析 在Map集合中, HashMap 则是最具有代表性的,也是我们最常使用到的 Map 集合.由于 HashMap 底层涉及了很多的知识点,可以比较好的考察一个人的Java的基本 ...

  4. HashMap源码实现分析

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 一.前言 HashMap 顾名思义,就是用hash表的原理 ...

  5. HashMap 源码详细分析(JDK1.8)

    1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值 ...

  6. Java HashMap源码剖析

    一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外,HashMap  ...

  7. HashMap 源码详细分析(JDK1.8) 1

    1.概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值, ...

  8. Java集合框架之 Java HashMap 源码解析

    继上一篇文章Java集合框架综述后,今天正式开始分析具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 签名(signature) public class HashMap<K,V> ...

  9. Android 5.1 Settings源码简要分析

    概述: 先声明:本人工作快两年了,仍是菜鸟级别的,惭愧啊!以前遇到好多知识点都没有记录下来,感觉挺可惜的,现在有机会接触Android 源码.我们一个Android组的搞Setting,我觉得是得写得 ...

最新文章

  1. Linux CPU数量判断命令
  2. JSP项目目录中每个文件夹及配置文件的作用
  3. 为何IDEA比Eclipse更好!
  4. 编译原理:全片知识难点总结
  5. 力扣977,有序数组的平方(JavaScript)
  6. 软件工程专业大学四年学什么
  7. 微信小程序金额千分位
  8. Revealing the predictability of intrinsic structure in complex networks
  9. Abstract Travel代码解析
  10. python turtle图片保存_turtle绘图保存png,jpg等图片
  11. xv6进程切换-swtch函数
  12. 计算机休眠唤醒后分辨率变小了,WIN10休眠唤醒后,所有的窗口都跑到了左上角,如何解决?...
  13. 构造伽罗华域GF(2^m)的方法
  14. 湖北智禾教育:淘宝店铺如何找货源?
  15. java计算机毕业设计vue基层社区管理服务网MyBatis+系统+LW文档+源码+调试部署
  16. 采药问题 c语言程序,采药-题解(C语言代码)
  17. linux给红米note4x刷机,红米Note4X 刷机LineageOs 14.1全过程讲解
  18. c语言有效字符序列称为,C语言选择题库.docx
  19. 推荐必读书籍整理集合
  20. Linux驱动学习之什么是驱动?

热门文章

  1. 用户控件的定制和使用
  2. centos 查看mysql 服务器配置_在CentOS上MySQL数据库服务器配置方法
  3. Maltego更新到4.2.6
  4. Xamarin设备相关图片尺寸要求
  5. sqlite导入 mysql_Sqlite向MySql导入数据
  6. 一个html文档所需要的最基本的标记对是,川大《WEB技术》19秋在线作业1题目【标准答案】...
  7. 拆分工作簿为多个文件_刻意地练习Excel快速拆分工作簿「例07-4」
  8. iOS限定UITextField的输入格式
  9. 上海交大研究人员使用非侵入性脑机接口和计算机视觉引导对机器人手臂进行共享控制...
  10. 脑电分析系列[MNE-Python-19]| 可视化Evoked数据