1.HashMap底层是通过什么来实现的?

  在JDK1.7中是通过数组+链表来实现的;

  在JDK1.8中是通过数组+链表+红黑树来实现的

2.HashMap在JDK1.8中为什么使用红黑树?

  为了弥补JDK1.7中会出现的单链表过长(默认size超过8即转为红黑树,也可自己设置),导致查询效率低的问题,使用红黑树替代长链表,优化了插入和查询的效率

3.HasMap中如果哈希值冲突怎么办?

  (1).再散列法:再次进行计算哈希值;

  (2).链表法:使当前entry<k,v>.next指向冲突的值;

4.HashMap中初始化数组长度为多少?为什么要取2的幂次方大小呢?

  初始数组长度为大于当前key长度的最近2的幂次方值;

  通过源码可以发现,在计算出当前key的哈希值后,会进行当前数组长度(length-1)和key哈希值(已经处理过的hash值)的&计算,          所以可以得出只有取2的幂次方大小,才可以避免下标越界的发生。

/** h为计算后的hash值,length为当前数组长度 */
static int indexFor(int h,int lengh){
return h & (length-1);
}

5.HashMap中的key值可以为null吗?

  通过查看源码可知,在put方法中,有针对瑜key为空的判断,即可以为null

if(key==null)
return putForNullKey(value);

  同时key为null的元素,其位置是固定的,在数组第一位(table[0]),所以意味着可以为null,但是只能有一个为null,而且table[0]只能存在一个value值,不能存储链表。

6.HashMap中插入数据时,在计算完key的hash值后,为什么还要再次进行异或运算才能得出最终hash值?

  为了避免出现大概率的hash值重复,所以通过右移、异或运算等操作对hash值进行再次计算,减小hash值冲突率,提高HashMap散列性,提高get方法效率

7.HashMap的扩容,是在插入数据前还是插入数据后进行扩容?

  JDK1.7:元素插入之前进行扩容

JDK1.8: 元素插入之后进行扩容

8.HashMap扩容的条件是什么?

  JDK1.7:元素超了阈值,同时新放置的key的hash值没有重复

9.JDK1.7中多线程扩容HashMap有可能出现什么问题?

   陷入死循环,无限循环链表,占用cup100%

10.为什么在重写equals方法的时候也要重写hashcode方法?

  由于在重写equals方法时设置了比较的对象,所以需要对hashcode指定只针对该对象进行hash值编译,其它不进行equals的对象则不进行求取hash值。

public class MyMap {
private String id;
private String name;
/**
* @Description: 只要id相同,则获取的value 值相同
* @Param: [o]
* @return: boolean
* @Date: 2019-12-24
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyMap myMap = (MyMap) o;
return Objects.equals(id, myMap.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}

HashMap常见面试题的更多相关文章

  1. java面试题之----HashMap常见面试题总结

    “你用过HashMap吗?” “什么是HashMap?你为什么用到它?” 几乎每个人都会回答“是的”,然后回答HashMap的一些特性,譬如HashMap可以接受null键值和值,而Hashtable ...

  2. HashMap常见面试题整理

    花了三天时间来仔细阅读hashMap的源码,期间补了下不少数据结构的知识,刷了不少相关的面试题并进行了整理 1.谈一下HashMap的特性? 1.HashMap存储键值对实现快速存取,允许为null. ...

  3. Mybatis常见面试题

    Mybatis常见面试题 #{}和${}的区别是什么? #{}和${}的区别是什么? 在Mybatis中,有两种占位符 #{}解析传递进来的参数数据 ${}对传递进来的参数原样拼接在SQL中 #{}是 ...

  4. JavaSE:数据类型之间的转换(附常见面试题)

    数据类型之间的转换 分为以下几种情况: 1)低级到高级的自动类型转换: 2)高级到低级的强制类型转换(会导致溢出或丢失精度): 3)基本类型向类类型转换: 4)基本类型向字符串的转换: 5)类类型向字 ...

  5. java常见面试题及答案

    java常见面试题及答案 来源 https://blog.csdn.net/hsk256/article/details/49052293 来源 https://blog.csdn.net/hsk25 ...

  6. 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...

  7. Java面试炼金系列 (1) | 关于String类的常见面试题剖析

    Java面试炼金系列 (1) | 关于String类的常见面试题剖析 文章以及源代码已被收录到:https://github.com/mio4/Java-Gold 0x0 基础知识 1. '==' 运 ...

  8. redis知识点及常见面试题

    redis知识点及常见面试题 参考: https://zm8.sm-tc.cn/?src=l4uLj4zF0NCIiIjRnJGdk5CYjNGckJLQrIqNiZaJnpOWjIvQno2Llpy ...

  9. java常见面试题及答案 1-10(基础篇)

    java常见面试题及答案 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程.Java 源文件被 ...

随机推荐

  1. .NET面试题集锦①

    一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.面向对象的思想主要包括什么? 答:任何事物都可以理解为对象,其主要特征: 继承.封装.多态.特点:代码好维护,安 ...

  2. vagrant(一)初识与安装

    链接:https://pan.baidu.com/s/1I2RNMNq9G-P4k42-U1Jjtw (这里有需要准备的安装包以及镜像文件,也可自己去官网下载)提取码:jis8 安装VirtualBo ...

  3. SQL SERVER视图对查询效率的提高

    SQL SERVER视图不仅可以实现许多我们需要的功能,而且对于SQL SERVER查询效率的提高也有帮助,下面一起来了解一下. 有两张数据表:A和B,其中A的记录为2万条左右,而B中的数据为200万 ...

  4. C#后台获取post参数

    public static string GetQueryString(string key) { if (HttpContext.Current.Request[key] == null) retu ...

  5. 禁止多用户进入win7系统的方法(图文)

    windows7系统可以支持多用户登陆,虽然它能为使用者提供方便,但是为安全起见,一些用户想要禁止多用户进入win7系统,因为我们并不能保证其他账户用户在使用过程中是否会安装病毒程序.那么如何禁止多用 ...

  6. ROM、RAM、DRAM、SRAM、FLASH的区别?

    在学习单片机的时候经常会被这些东西搞晕掉,什么ROM RAM FLASH EEPROM 等等......为了不被搞晕,做个笔记,不记得的时候过来看看. 下面是我在网上找的资料: ROM和RAM指的都是 ...

  7. 109、TensorFlow计算张量的值

    # 当计算图创建成功时 # 你就可以运行这个计算图,然后生成一个新的张量 # 并且得到这个张量指向的计算图中具体的数值 #这个功能在debug的时候非常有必要 #最简单获得张量具体值的方法是使用Ten ...

  8. mysql linux下安装部署

    一.安装简介 用户名:mysql安装目录:/usr/local/mysql-5.5数据库目录:/data/mysql/data源码包:mysql-5.5.28.tar.gz 二.安装准备 a.vi / ...

  9. T1215:迷宫

    [题目描述] 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行.同时当Extense处在某 ...

  10. javascript 计算两个整数的百分比值

    ///计算两个整数的百分比值 function GetPercent(num, total) { num = parseFloat(num); total = parseFloat(total); i ...