文档章节

HashMap之微代码解析-总结整理

指尖Coding
 指尖Coding
发布于 2016/08/13 11:47
字数 414
阅读 6
收藏 0

1.HashMap继承AbstractMap类,实现Map接口。key和value都允许为null,非线程安全。

2.HashMap底层是使用数组和链表实现的,当new一个HashMap的时候,jvm就会初初始化一个数组。

3.HashMap的put方法是,现根据key计算hashcode,根据hashcode计算该元素在数组中的位置,数组的内容是一个链表(链表有next节点)。

4.哈系运算会有重复的哈希值,对于哈希值的冲突,HashMap采用链表(挂链)来解决的。

数组存储的是链表,链表是为了解决哈希冲突的。

/**
* next就是为了哈希冲突而存在的。比如通过哈希运算,一个新元素应该在数组的第10个位置,
* 但是第10个位置已经有Entry,那么好吧,将新加的元素也放到第10个位置,将第10个位置的
* 原有Entry赋值给当前新加的 Entry的next属性。数组存储的是链表,链表是为了解决哈希冲突的。
*
*/
static class Entry<K,V> implements Map.Entry<K,V> {    
     final K key;    
     V value;    
     Entry<K,V> next;    
     int hash;    
}    

5.当两个对象的hashcode相同会发生什么?

因为hashcode相同,所以它们的存储数组位置相同,‘碰撞’会发生。因为HashMap使用LinkedList存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在LinkedList中。

6.如果两个键的hashcode相同,你如何获取值对象?

根据hashcode找到数组位置,然后遍历LinkedList直到找到值对象,HashMap在链表LinkedList中存储的是键值对。

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
指尖Coding
粉丝 1
博文 58
码字总数 39249
作品 0
静安
私信 提问
Java集合 --- LinkedHashMap底层实现和原理(源码解析)

概述 文章的内容基于JDK1.7进行分析,之所以选用这个版本,是因为1.8的有些类做了改动,增加了阅读的难度,虽然是1.7,但是对于1.8做了重大改动的内容,文章也会进行说明。 LinkedHashMap,见...

起个名忒难
2017/09/24
0
0
Java 集合系列目录(Category)

Java 集合系列目录(Category) 下面是最近总结的Java集合(JDK1.6.0_45)相关文章的目录。 01. Java 集合系列01之 总体框架 02. Java 集合系列02之 Collection架构 03. Java 集合系列03之 Arra...

foxeye
2016/02/29
61
0
一篇文章,全面总结Android面试知识点

本篇文章的所有知识点是亲身经历十余家一二线互联网企业面试后总结产出,包含应聘Android开发岗位的各个方面的高频知识点,主要针对但不局限于Android应届面试。以下所有知识点都整理发布在G...

Ruheng
2017/10/17
0
0
Java容器源码分析-HashMap vs TreeMap vs LinkedHashMap

这里我采用的分析方式是帖子博客加上自己翻看jdk源码。有些情况下写一些测试的算法小例子加深印象。我这里只描述一下自己的总结想法 上一篇文章我们研究了set接口下的几个容器,由于其Set集合...

贾浩v
2017/10/19
0
0
一篇文章,全面总结Android面试知识点

本篇文章的所有知识点是亲身经历十余家一二线互联网企业面试后总结产出,包含应聘Android开发岗位的各个方面的高频知识点,主要针对但不局限于Android应届面试。以下所有知识点都整理发布在G...

Ruheng
2017/10/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Caffe(二)-Python-自定义网络

这里我们用一个例子先来体验一下 首先定义一下我们的环境变量 $PYTHONPATH,我这儿是Windows开发环境,至于Windows Caffe怎么编译由读者自己下去搞定 我使用的控制台是 Windows PowerShell 添...

Pulsar-V
32分钟前
2
0
ActiveMQ从入门到精通(二)之可靠性机制

ActiveMQ的可靠性机制 缘由( 确认JMS消息) 只要消息被确认之后,才认为消息被成功消费了。消息的成功消费包括三个阶段:客户端接收消息、客户端处理消息以及客户端确认消息。在事务性会话中...

一看就喷亏的小猿
40分钟前
0
0
源码分析 Mybatis 的 foreach 为什么会出现性能问题

背景 最近在做一个类似于综合报表之类的东西,需要查询所有的记录(数据库记录有限制),大概有1W条记录,该报表需要三个表的数据,也就是根据这 1W 个 ID 去执行查询三次数据库,其中,有一...

TSMYK
今天
7
0
IC-CAD Methodology企业实战之openlava

在云计算解决安全问题并成为IC界主流运算平台之前,私有的服务器集群系统仍然是各大IC公司的计算资源平台首选。 现在主流的服务器集群管理系统包括lsf,openlava,SkyForm,三者都属于lsf一系...

李艳青1987
今天
5
0
http response stream 字节流 接收与解码

在接收图片、音频、视频的时候,需要用到二进制流。 浏览器会发给客户端 字节Byte流,一串串的发过来_int8格式 -128~127(十进制),也就是8bit(位)。 客户端接收的时候,对接收到的字节收集,...

大灰狼wow
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部