【解析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常见问题的更多相关文章

  1. (转)Java集合框架:HashMap

    来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...

  2. [Java集合] 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.

    注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享. 原文地址: http://blog.csdn.net/zhanger ...

  3. Java集合框架:HashMap

    转载: Java集合框架:HashMap Java集合框架概述   Java集合框架无论是在工作.学习.面试中都会经常涉及到,相信各位也并不陌生,其强大也不用多说,博主最近翻阅java集合框架的源码以 ...

  4. 深入解析HashMap、HashTable

    集合类之番外篇:深入解析HashMap.HashTable Java集合类是个非常重要的知识点,HashMap.HashTable.ConcurrentHashMap等算是集合类中的重点,可谓“重中之 ...

  5. Java集合--HashMap分析

    HashMap在Java开发中有着非常重要的角色地位,每一个Java程序员都应该了解HashMap. 本文主要从源码角度来解析HashMap的设计思路,并且详细地阐述HashMap中的几个概念,并深入 ...

  6. 并发-HashMap和HashTable源码分析

    HashMap和HashTable源码分析 参考: https://blog.csdn.net/luanlouis/article/details/41576373 http://www.cnblog ...

  7. 彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.

    注: 今天看到的一篇讲hashMap,hashTable,concurrentHashMap很透彻的一篇文章, 感谢原作者的分享.  原文地址: http://blog.csdn.net/zhange ...

  8. 深入解析HashMap、HashTable (转)

    集合类之番外篇:深入解析HashMap.HashTable Java集合类是个非常重要的知识点,HashMap.HashTable.ConcurrentHashMap等算是集合类中的重点,可谓&quo ...

  9. java中list和map详解

    一.概叙 List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口, List下有ArrayList,Vector,LinkedList Set下有HashSet ...

随机推荐

  1. C++对象内存模型1(堆栈模型)(转)

    对象内存模型 一. 栈(Stack) VS. 堆(heap) 栈 由系统自动管理,以执行函数为单位 空间大小编译时确定(参数+局部变量) 函数执行时,系统自动分配一个stack 函数执行结束时,系统立 ...

  2. reshape()函数

    """ 1.当原始数组A[4,6]为二维数组,代表4行6列. A.reshape(-1,8):表示将数组转换成8列的数组,具体多少行我们不知道,所以参数设为-1.用我们的 ...

  3. Idea中,项目文件右键菜单没有svn选项处理办法

    问题描述 IntelliJ IDEA打开带SVN信息的项目,在项目文件上点击右键,菜单中没有Subversion的功能项,如下图: 解决办法 点击菜单:VCS -> Enabled Versio ...

  4. UVa10828 Back to Kernighan-Ritchie——概率转移&&高斯消元法

    题意 给出一个程序控制流图,从每个结点出发到每个后继接结点的概率均相等.当执行完一个没有后继的结点后,整个程序终止.程序总是从编号为1的结点开始.你的任务是对于若干个查询结点,求出每个结点的期望执行次 ...

  5. mssql提权

    MSSQL的提权:下面是三种方法一种利用xp_cmshell组件,还有一种sp_OACreate组件,COM组件 xp_cmshell组件的开启: 1.sql2005版本以后默认为关闭状态,需要开启命 ...

  6. async、await总结

    一.async用法 async作为一个关键字放到函数前面,用于表示函数是一个异步函数.异步函数也就意味着该函数的执行不会阻塞后面代码的执行. 异步函数语法很简单,就是在函数前面加上async 关键字, ...

  7. git:GitLab代码回滚到特定版本

    在当前branch上多次commit代码并且push后,发现不符合要求,需要回滚到特定的版本.步骤如下: 1.查找commitId (1)用命令行打开git项目路径,输入git log命令查看comm ...

  8. 检测算法简介及其原理——fast R-CNN,faster R-CNN,YOLO,SSD,YOLOv2,YOLOv3

    1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...

  9. tomcat启动报错java.lang.OutOfMemoryError:PermGen space解决办法

    tomcat启动错误提示: 严重: Error waiting for multi-thread deployment of WAR files to completejava.util.concur ...

  10. 使用pwn_deploy_chroot部署国赛pwn比赛题目

    目录 使用pwn_deploy_chroot部署国赛pwn比赛题目 一.前言 二.Docker 三.部署镜像 四.pwn_deploy_chroot 五.check && exp 六. ...