hashMap常见问题
【解析hashMap的源码实现】
0、谈谈对hashMap的理解?
从底层结构、存取、扩容、冲突、实现原理、源码等方面说明。
1、你知道哪些常用的Map集合?
HashMap、HashTable、LinkedHashMap、ConcurrentHashMap。
2、Collection集合接口和Map接口有什么关系?
List,Set都是继承自Collection接口(单列集合),Map则不是(双列集合)。
3、HashMap是线程安全的吗?线程安全的Map都有哪些?性能最好的是哪个?
HashMap不是线程安全的。
线程安全的有HashTable、ConcurrentHashMap、SynchronizedMap。
性能最好的是ConcurrentHashMap。
4、使用HashMap有什么性能问题吗?
使用HashMap要注意避免集合的扩容。
它会很耗性能(扩容后要进行索引重排),根据元素的数量给它一个初始大小的值。
5、HashMap的数据结构是怎样的?默认大小是多少?内部是怎么扩容的?
HashMap是数组和链表组成的。
默认大小为16。
当hashmap中的元素个数超过数组大小*loadFactor(默认值为0.75)时就会把数组的大小扩展为原来的两倍大小,然后重新计算每个元素在数组中的位置。
5.1为什么扩容是原先的两倍?【***】
连接:hashMap的扩容机制resize()
使用一个容量更大的数组来代替已有的容量小的数组,transfer()方法将原有Entry数组的元素拷贝到新的Entry数组里。
6、怎么按添加顺序存储元素?怎么按A-Z自然顺序存储元素?怎么自定义排序?
按添加顺序使用LinkedHashMap。
按自然顺序使用TreeMap。
按自定义排序TreeMap(Comparetor c)。
7、HashMap的链表结构设计是用来解决什么问题的?
HashMap的链表结构设计是用来解决key的hash冲突问题的。
8、HashMap的键、值可以为NULL吗?HashTable呢?
HashMap的键值都可以为NULL,HashTable不行。
9、HashMap使用对象作为key,如果hashcode相同会怎么处理?
key的hash冲突,如果key equals一致将会覆盖值,不一致就会将值存储在key对应的链表中。
10、HashMap中的get操作是什么原理?
先根据key的hashcode值找到对应的链表,再循环链表,equals比较操作找到对应的值。
11、hashCode相等的两个类一定相等吗?equals呢?相反呢?
hashCoded相等的两个类不一定相等,equals相等了一定相等。
12、介绍一下集合框架?单列集合、双列结合
* Collection 一次存一个对象, 单列集合
* List 可重复, 有索引,存取有序
1、ArrayList 数组实现, 查找快,增删慢
查找快是因为有索引,增删满是因为增删后需要进行索引重排。
2、LinkedList 链表实现, 增删快
增删快是因为需要进行索引重排,只需要改变链表元素前后的引用即可。
3、Vector 数组实现, 线程安全
线程安全是因为增删操作使用了synchronize同步锁。
* Set 不可重复, 没索引,存取无序
1、HashSet 使用哈希算法去重复, 效率高, 但元素无序
2、TreeSet 使用二叉树算法排序, 可以指定元素的存储顺序
3、LinkedHashSet HashSet的子类, 原理相同, 除了去重复之外还能保留存储顺序
* Map 一次存两个对象, 键值对
1、HashMap 使用哈希算法对键去重复, 效率高, 但无序
2、TreeMap 使用二叉树算法排序, 可以自定义顺序
3、LinkedHashMap 使用哈希算法去重复, 并且保留存储顺序
4、Hashtable 类似HashMap, 线程安全, 效率略低, 不允许null键和null值
5、SynchronizedHashMap
6、ConcurrentHashMap 是并发包下线程安全的hashmap
在JDK1.8以前ConcurrentHashMap 使用了分段加锁(原理)的方式保证了高效率的线程安全,JDK1.8及以后使用了红黑树和CAS算法保证ConcurrentHashMap 的线程安全。
13、hashMap、hashTable、concurrentHashMap底层实现?
hashMap:
链表和数组的结合体
hashTable:
散列结构和hashmap一样
concurrentHashMap:
14、hashMap和treeMap的区别?底层用到什么数据结构?
1、实现 (底层数据结构)
TreeMap:SortMap接口,基于红黑树
HashMap:基于哈希散列表实现
2、存储
TreeMap:默认按键的升序排序
HashMap:随机存储
3、遍历
TreeMap:Iterator遍历是排序的
HashMap:Iterator遍历是随机的
4、性能损耗
TreeMap:插入、删除
HashMap:基本无
5、键值对
TreeMap:键、值都不能为null
HashMap:只允许键、值均为null
6、安全
TreeMap:非并发安全Map
HashMap:非并发安全Map
7、效率
TreeMap:低
HashMap:高
* 一般情况下我们选用HashMap,因为HashMap的键值对在取出时是随机的,其依据键的hashCode和键的equals方法存取数据,具有很快的访问速度,所以在Map中插入、删除及索引元素时其是效率最高的实现。而TreeMap的键值对在取出时是排过序的,所以效率会低点。
15、线程安全与线程不安全的集合?
* 线程安全:
StringBuffer、HashTable、Vector、SynchronizedHashMap、concurrentHashMap
* 线程不安全:
StringBuilder、HashMap、LinkedList、ArrayList、HashSet
16、hashMap的原理,底层数据结构?*****
底层使用 哈希表(数组+链表)的数据结构,当链表过长,会将链表转成红黑树以实现O(logn)时间复杂度查询。
17、讲一讲hashMap中put方法的过程?*****
1、对key求hash值,计算下标
2、如果没有碰撞直接放入桶中
3、如果碰撞了以链表的方式,连接到后边
4、如果链表长度超过阈值(TREEIFY_THRESHOLD == 8)就把链表转成红黑树。
5、如果节点已经存在就替换旧值。
6、如果桶满了(容量*加载因子)就需要resize()扩容为原来的2倍。
18、hashMap中的hash函数是怎么实现的?还有哪些hash的实现方式?*****
1、高16bit不变,高16bit和低16bit做了一个异或。
2、(n-1)& hash得到下标
还有哪些hash实现方式,可以参考Effective Java 学习笔记 hashCode()
19、hashMap是怎么解决hash冲突的,讲一下扩容过程,加入一个值在原数组中,现在移动了新数组,位置肯定变了,那是什么定位到了这个值在数据中的位置?*****
1、将新节点加到链表后
2、容量扩充为原来的两倍,然后对每个节点重新计算hash值。
3、这个值只可能存在两个地方,一个是原下标的位置,另一种是在下标为<原下标 + 原容量的位置>。
20、抛开hashMap,hash冲突有哪些解决办法?
开放定址、链地址法。
21、针对hashMap中某个Entrty链太长,查找的时间复杂度可能达到O(n)怎么优化?
链表转为红黑树,JKD 1.8已经实现。
hashMap常见问题的更多相关文章
- (转)Java集合框架:HashMap
来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...
- [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...
- Java集合框架:HashMap
转载: Java集合框架:HashMap Java集合框架概述 Java集合框架无论是在工作.学习.面试中都会经常涉及到,相信各位也并不陌生,其强大也不用多说,博主最近翻阅java集合框架的源码以 ...
- 深入解析HashMap、HashTable
集合类之番外篇:深入解析HashMap.HashTable Java集合类是个非常重要的知识点,HashMap.HashTable.ConcurrentHashMap等算是集合类中的重点,可谓“重中之 ...
- Java集合--HashMap分析
HashMap在Java开发中有着非常重要的角色地位,每一个Java程序员都应该了解HashMap. 本文主要从源码角度来解析HashMap的设计思路,并且详细地阐述HashMap中的几个概念,并深入 ...
- 并发-HashMap和HashTable源码分析
HashMap和HashTable源码分析 参考: https://blog.csdn.net/luanlouis/article/details/41576373 http://www.cnblog ...
- 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhange ...
- 深入解析HashMap、HashTable (转)
集合类之番外篇:深入解析HashMap.HashTable Java集合类是个非常重要的知识点,HashMap.HashTable.ConcurrentHashMap等算是集合类中的重点,可谓&quo ...
- java中list和map详解
一.概叙 List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口, List下有ArrayList,Vector,LinkedList Set下有HashSet ...
随机推荐
- httpclient post请求中文乱码解决办法
在使用httpclient发送post请求的时候,接收端中文乱码问题解决. 正文: 我们都知道,一般情况下使用post请求是不会出现中文乱码的.可是在使用httpclient发送post请求报文含中文 ...
- 珠峰 - 郭永峰react课程 node es6 babel学习笔记
npm install babel-cli -g //安装babel babel index.js -o a.js //等同于 babel index.js --out-file a.js 复制ind ...
- opencv图像处理之gamma变换
import cv2 import numpy as np img=cv2.imread('4.jpg') def adjust_gamma(image, gamma=1.0): invGamma = ...
- [Codeforces Educational Round 71]Div. 2
总结 手速场...像我这种没手速的就直接炸了... 辣鸡 E 题交互,少打了个 ? 调了半个小时... 到最后没时间 G 题题都没看就结束了...结果早上起来被告知是阿狸的打字机...看了看题一毛一样 ...
- NOI2018游记【一年后的回忆】
今天是2019年9月6日,我坐在大学的宿舍里,同样敲着键盘,在一年前充满回忆与汗水的博客上,又一次地回忆往事. 那是2018年的7月,我停了三个月的课,攥着一张thusc的安慰约,放手在OI的生涯最后 ...
- 【游记】CSP2019 垫底记
考试时候的我: Day 1 做完 \(T1\) 和 \(T2\),还有 \(2.5 h\),我想阿克 \(Day1\).(\(T3\):不,你不想) 不过一会就想出来给每个点 dfs 贪心选一个点,然 ...
- 【NOIP2015】斗地主 D1 T3 及 增强版 (送命题)
恶心送命模拟题 暴搜顺子,DP预处理剩下的. 由于官方数据太水,很多情况没有讨论的都能过普通版本,想要测试自己代码正确性的同学们可以交交这道题,有很多dalao给出了hack数据 : Luogu P2 ...
- Direction of Arrival Based Spatial Covariance Model for Blind Sound Source Separation
基于信号协方差模型DOA的盲声源分离[1]. 在此基础上,作者团队于2018年又发布了一篇文章,采用分级和时间差的空间协方差模型及非负矩阵分解的多通道盲声源分离[2]. 摘要 本文通过对短时傅立叶变换 ...
- Redis存储List
list中数据可以重复,查询快,增删慢. 存储结构: 1.向List存取数据: 查询list中的全部元素: 第一个进入a,第二个进入b,并将a向后移一位. 上图为从右边插入元素的情况. 2.从两头取出 ...
- mysql 通配符%以及_
%匹配任意长度 _ 匹配单个字符 mysql> select * from table1; +----------+------------+-----+-------------------- ...