HashMap内部存储实现及HashTable比较
一、HashMap的内部存储实现
HashMap底层实现的数据结构是哈希表。哈希表的实现一般有两种,第一种是数组(闭散列),第二种是数组+链表(开散列)。而HashMap采用的是“数组+链表”的实现,
即数组存储链表的头结点。
1、HashMap存储数据时进行put( key, value )的操作,源代码如下:
- public V put(K key, V value) {
- if (key == null)
- return putForNullKey(value);
- int hash = hash(key.hashCode()); //首先进行key.hashCode()操作,获取key的哈希值
- int i = indexFor(hash, table.length); //相当于:int i = hash % Entry[].length,Entry.length是数组长度
- 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;
- e.recordAccess(this);
- return oldValue;
- }
- }
- modCount++;
- addEntry(hash, key, value, i);
- return null;
- }
注意:在Entry类里面有一个next属性,指向下一个Entry。例如,第一个键值对A进来,通过计算得到其key的hash是1,则存储:Entry[1]=A。接着,第二个键值对B进来,其key的hash也等于1,那么HashMap会这样做:B.next = A, Entry[1] = B,以此类推。由此可知,数组中存储的是最后插入的元素。
2、取出数据进行get( key )操作,源代码如下:
- public V get(Object key) {
- if (key == null)
- return getForNullKey();
- int hash = hash(key.hashCode());
- for (Entry<K,V> e = table[indexFor(hash, table.length)];
- e != null;
- e = e.next) {
- Object k;
- if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
- return e.value;
- }
- return null;
- }
当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比较相关推荐
- Java HashMap原理及内部存储结构
本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程. public static void main(String[] args) {Map<String, String> ...
- 结构体中初始化vector resize_Java-深入HashMap原理及内部存储结构
本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程. public static void main(String[] args) {Map<String, String> ...
- 哈希存储 java_Java容器系列之HashMap的存储
Java容器系列之HashMap 概要 本文将结合Java源码总结HashMap的存储结构及其扩容策略,并根据这些特点给出使用HashMap的最佳实践. 本文不再介绍HashMap的基本使用,有需要的 ...
- PyTorch 笔记(11)— Tensor内部存储结构(头信息区 Tensor,存储区 Storage)
1. Tensor 内部存储结构 tensor 数据结构如下图所示,tensor 分为头信息区(Tensor)和存储区 (Storage),信息区主要保存着 Tensor 的形状(size).步长(s ...
- android 读取内部存储文件格式,Android中的数据储存之文件存储
当我们在使用各种程序时,其实际上是在和各种数据打交道,当我们聊QQ,刷微博,看新闻,其实都是在和里面的数据交互 例如在聊天时发出的消息,以及在登录时输入的账号密码,其实都是瞬时数据,那什么是瞬时数据呢 ...
- android 根目录缓存,Android系统中内部存储和外部存储(公有目录、私有目录、缓存目录)详解...
首先,明确一个概念,Android内部存储和外部存储并非所谓的手机自带内存是内部存储,SD卡是外部存储云云. Android对内部存储和外部存储不是在物理上区分的,而是在逻辑上区分的.git 1.概念 ...
- 聊一聊 Redis 数据内部存储使用到的数据结构
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 R ...
- java 访问手机存储卡,Android App将数据写入内部存储和外部存储的示例
File存储(内部存储) 一旦程序在设备安装后,data/data/包名/ 即为内部存储空间,对外保密. Context提供了2个方法来打开输入.输出流 FileInputStream openFil ...
- android 获取手机SD卡和手机的内部存储
在开发过程中有时候会获取手机的SD存储使用状况. 布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/re ...
- android10 内部存储,Android的内部存储和外部存储
描述 内部存储: 1.不需要权限 2.当MODE_PRIVATE时,其他App不可操作.非MODE_PRIVATE 时也需要别的APP知道包名.文件名才能访问. 3.当删除App时,移除文件 方法: ...
最新文章
- C#中equal与==的区别
- 树莓派 mysql集群_多树莓派集群服务器
- 下面可提供安全电子邮件服务的是()【最全!最详细解析!!】
- homestead 安装mysql8_homestead安装php redis扩展
- SNMP协议交互学习-获取udp的udpindatagrams
- 虚拟机卡在登录界面卡住了_手机都10核了 为何还是照样卡?
- selenium webdriver——鼠标事件
- 想成长为一名年薪50万+的实战型架构师?必掌握这7大实战技能经验
- 用免费WiFi上网软件有什么好处
- P1540 机器翻译洛谷题解
- 我国三大运营商即将开始联手屏蔽垃圾短信
- 商务与经济统计 笔记
- Linux中的ps命令详解
- 快速开始keras 教程
- bzoj2683/4066 简单题
- 工程师的基本功是什么?该如何练习?
- afterlogic webmail lite php,windows内网邮件服务器搭建(hMailserver+ AfterLogic WebMail Lite)
- 技术项目 - Linux网卡中断使单个CPU过载
- 正则表达式元字符大整理
- string刷题集合