面试题:请说一下HashMap的底层实现原理。
个人网站:riun's blog
(现在都在这上面写东西)
HashMap使用数组加链表实现。每个数组元素中储存着链表。
当使用put方法储存key-value键值对时,会先调用key的hashCode方法,得到此key经特定哈希运算后的值,然后将此值通过其他运算(?)得到一个值,将这个值与(length-1)做或操作(&),相当于对数组长度做取余操作。最终得到一个值作为此key在数组中的索引值,然后将key-value键值对储存进去。通过这种方法将储存的不同key-value键值对“散列”到数组的不同位置。
在储存的时候,如果索引位置尚无元素,那么直接储存。如果有元素,那么就调用此key的equals方法与原有的元素的Key进行比较。如果返回true,说明在这个equals定义的规则上,这两个Key相同,那么将原有的key保留,用新的value代替原来的value。如果返回false,那么就说明这两个key在equals定义的规则下是不同元素,那么就与此链表的下一个结点进行比较,知道最后一个结点都没有相同元素,再下一个是null的时候,就用头插法将此key-value添加到链表上。
HashMap对重复元素的处理方法是:key不变,value覆盖。
当使用get方法获取key对应的value时,会和储存key-value时用同样的方法,得到key在数组中的索引值,如果此索引值上没有元素,就返回null。如果此索引值上有元素,那么就拿此key的equals方法与此位置元素上的key进行比较,如果返回true。就返回此位置元素对应的value。如果返回false,就一直按链表往下比较,如果都是返回false,那么就返回null。
另外:HashMap在JDK1.8之后引入红黑树结构。HashMap是线程不安全的,线程安全的是CurrentHashMap,不过此集合在多线程下效率低。
本人手写HashMap,实现部分方法:https://github.com/hanhanhanxu/MyHashMap
关于更多Hash算法,HashMap扩容机制等请移步我的个人博客网站:Hash | 旭
面试题:请说一下HashMap的底层实现原理。相关推荐
- java集合:HashMap的底层实现原理
HashMap的底层实现原理是面试中出现频率非常高的一道面试题,本文将对HashMap的底层实现原理做一个简要的概况和总结,便于复习. 一.对于Map集合存储结构的理解 首先介绍以HashMap为典型 ...
- Java HashMap的底层实现原理
一.Java HashMap的底层实现原理(以jdk7为例) 1.HashMap map = new HashMap(); 在实例化以后,才在底层创建了一个长度为16的一维数组 Entry [] ta ...
- 面试题:HashMap的底层运行原理(通俗易懂)
一图带你读懂HashMap的底层运行:
- 复习一波,hashMap的底层实现原理
前言 HashMa是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构,同时也是我们需要掌握的数据结构: java中集合的分类: java中的集合可以分为:单列集合(collectio ...
- HashMap的底层原理你真的知道?
HashMap的底层实现原理是面试中出现频率非常高的一道面试题,本文将对HashMap的底层实现原理做一个简要的概况和总结,便于复习. 一.对于Map集合存储结构的理解 首先介绍以HashMap为典型 ...
- HashMap的底层存储结构和实现原理
文章目录 前言 一.HashMap是什么? 二. 数组 三. 链表 四.哈希算法 五.哈希冲突 总结 前言 HashMap实现了Map接口,我们常用来put/get操作读存键值对数据,比较典型的key ...
- 聊聊Java系列-集合之HashMap底层结构原理
前言 由于HashMap在我们的工作和面试中会经常遇到,所以搞懂HashMap的底层结构原理就显得十分有必要了.在JDK1.8之前,HashMap的底层采用的数据结构是数组+链表, ...
- 【java】HashMap底层实现原理及面试题
目录 一.哈希表(散列) 1.什么是哈希表 2.什么是哈希冲突(面试题) 3.解决哈希冲突的方法(面试题) (1) 开放地址法 ① 线性探查 ②二次探查 ③随机探查 (2) 再哈希法 (3) 链地址法 ...
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别(转)
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别 文章来源:http://www.cnblogs.com/beatIteWeNerverGiveU ...
最新文章
- Android AOSP 单独编译某一模块
- 流程图在登录后会增加操作选项的方法
- boost::endian模块实现benchmark的测试程序
- git/github使用完整教程(2)分支
- mysql 5.6 禁用 innodb_MYSQL 5.6中禁用INNODB引擎
- 堆和栈的区别(转过无数次的文章)
- java中各种时间格式的转化
- Python:Python3错误提示TypeError: slice indices must be integers or None or have an __index__ method解决办法
- python换行输出三个数中最大数_关于Python 3中print函数的换行详解
- java文件删除操作_Java文件复制删除操作合集
- 工具 | Procexp工具使用及案例说明
- 华为主题包hwt下载_华为EMUI系统主题文件hwt修改及制作详细教程
- Java架构师成长之道之计算机组成原理概述篇
- PAT乙级1085:PAT单位排行 (25)
- 秒搜编程好书 就用这个Python写的爬虫网站
- 利用OBS和手机摄像头录课(录屏/录像)时的方法与参数设置
- 数学与应用数学专业考计算机研究生,数学与应用数学专业学生考研有哪些方向 数学与应用数学专业学生考研方向是怎样的...
- avro-java,proto-java
- pytorch深度学习笔记(一)
- 银内胆保温杯的功效和作用