一、HashMap的内部存储实现

HashMap底层实现的数据结构是哈希表。哈希表的实现一般有两种,第一种是数组(闭散列),第二种是数组+链表(开散列)。而HashMap采用的是“数组+链表”的实现,
即数组存储链表的头结点。
1、HashMap存储数据时进行put( key, value )的操作,源代码如下:

[java] view plaincopy
  1. public V put(K key, V value) {
  2. if (key == null)
  3. return putForNullKey(value);
  4. int hash = hash(key.hashCode()); //首先进行key.hashCode()操作,获取key的哈希值
  5. int i = indexFor(hash, table.length); //相当于:int i = hash % Entry[].length,Entry.length是数组长度
  6. for (Entry<K,V> e = table[i]; e != null; e = e.next) {
  7. Object k;
  8. if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
  9. V oldValue = e.value;
  10. e.value = value;
  11. e.recordAccess(this);
  12. return oldValue;
  13. }
  14. }
  15. modCount++;
  16. addEntry(hash, key, value, i);
  17. return null;
  18. }

注意:在Entry类里面有一个next属性,指向下一个Entry。例如,第一个键值对A进来,通过计算得到其key的hash是1,则存储:Entry[1]=A。接着,第二个键值对B进来,其key的hash也等于1,那么HashMap会这样做:B.next = A, Entry[1] = B,以此类推。由此可知,数组中存储的是最后插入的元素。

2、取出数据进行get( key )操作,源代码如下:

[java] view plaincopy
  1. public V get(Object key) {
  2. if (key == null)
  3. return getForNullKey();
  4. int hash = hash(key.hashCode());
  5. for (Entry<K,V> e = table[indexFor(hash, table.length)];
  6. e != null;
  7. e = e.next) {
  8. Object k;
  9. if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
  10. return e.value;
  11. }
  12. return null;
  13. }

当key不为空时,先根据hash函数得到hash值,再根据indexFor()得到数组的索引值,接着遍历链表。如果有key值等于已存在的key值,则返回其value。

二、HashMap和HashTable的比较
HashTable和HashMap采用相同的存储机制,二者的实现基本一致,不同的是:
1. HashMap是非线程安全的,HashTable是线程安全的。
2. HashMap的键和值都可以为null,但是HashTable不行。
3. 由于线程安全的关系,HashMap的效率比HashTable要高。

4. HashMap没有使用HashTable的contains()函数,取而代之的是containsKey()和containsValue()。

HashMap内部存储实现及HashTable比较相关推荐

  1. Java HashMap原理及内部存储结构

    本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程. public static void main(String[] args) {Map<String, String> ...

  2. 结构体中初始化vector resize_Java-深入HashMap原理及内部存储结构

    本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程. public static void main(String[] args) {Map<String, String> ...

  3. 哈希存储 java_Java容器系列之HashMap的存储

    Java容器系列之HashMap 概要 本文将结合Java源码总结HashMap的存储结构及其扩容策略,并根据这些特点给出使用HashMap的最佳实践. 本文不再介绍HashMap的基本使用,有需要的 ...

  4. PyTorch 笔记(11)— Tensor内部存储结构(头信息区 Tensor,存储区 Storage)

    1. Tensor 内部存储结构 tensor 数据结构如下图所示,tensor 分为头信息区(Tensor)和存储区 (Storage),信息区主要保存着 Tensor 的形状(size).步长(s ...

  5. android 读取内部存储文件格式,Android中的数据储存之文件存储

    当我们在使用各种程序时,其实际上是在和各种数据打交道,当我们聊QQ,刷微博,看新闻,其实都是在和里面的数据交互 例如在聊天时发出的消息,以及在登录时输入的账号密码,其实都是瞬时数据,那什么是瞬时数据呢 ...

  6. android 根目录缓存,Android系统中内部存储和外部存储(公有目录、私有目录、缓存目录)详解...

    首先,明确一个概念,Android内部存储和外部存储并非所谓的手机自带内存是内部存储,SD卡是外部存储云云. Android对内部存储和外部存储不是在物理上区分的,而是在逻辑上区分的.git 1.概念 ...

  7. 聊一聊 Redis 数据内部存储使用到的数据结构

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 R ...

  8. java 访问手机存储卡,Android App将数据写入内部存储和外部存储的示例

    File存储(内部存储) 一旦程序在设备安装后,data/data/包名/ 即为内部存储空间,对外保密. Context提供了2个方法来打开输入.输出流 FileInputStream openFil ...

  9. android 获取手机SD卡和手机的内部存储

    在开发过程中有时候会获取手机的SD存储使用状况. 布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/re ...

  10. android10 内部存储,Android的内部存储和外部存储

    描述 内部存储: 1.不需要权限 2.当MODE_PRIVATE时,其他App不可操作.非MODE_PRIVATE 时也需要别的APP知道包名.文件名才能访问. 3.当删除App时,移除文件 方法: ...

最新文章

  1. C#中equal与==的区别
  2. 树莓派 mysql集群_多树莓派集群服务器
  3. 下面可提供安全电子邮件服务的是()【最全!最详细解析!!】
  4. homestead 安装mysql8_homestead安装php redis扩展
  5. SNMP协议交互学习-获取udp的udpindatagrams
  6. 虚拟机卡在登录界面卡住了_手机都10核了 为何还是照样卡?
  7. selenium webdriver——鼠标事件
  8. 想成长为一名年薪50万+的实战型架构师?必掌握这7大实战技能经验
  9. 用免费WiFi上网软件有什么好处
  10. P1540 机器翻译洛谷题解
  11. 我国三大运营商即将开始联手屏蔽垃圾短信
  12. 商务与经济统计 笔记
  13. Linux中的ps命令详解
  14. 快速开始keras 教程
  15. bzoj2683/4066 简单题
  16. 工程师的基本功是什么?该如何练习?
  17. afterlogic webmail lite php,windows内网邮件服务器搭建(hMailserver+ AfterLogic WebMail Lite)
  18. 技术项目 - Linux网卡中断使单个CPU过载
  19. 正则表达式元字符大整理
  20. string刷题集合

热门文章

  1. Python心得基础篇【7】面向对象进阶篇
  2. mysql-5.6.24-win32解决没有my.ini并且修改编码
  3. SRM596 DIV2 500
  4. usaco-1.1.1-PROB Your Ride Is Here
  5. 软件工程 - 设计模式学习之策略模式Strategy
  6. 多路搜索树的初始化实现
  7. 关于禁用html中a标签的思考
  8. (整理)RMAN备份详解
  9. Java 8 新特性(一)lambda表达式
  10. Windows中下载并安装RabbitMQ