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. 使用Fiddler为满足某些特定格式的网络请求返回mock响应

    假设我想对本地Java程序发起的调用SAP Hybris web service https://jerrywang.com:9002/rest/v2/electronics/users/ 这个网络请 ...

  2. android android studio error

    SIMPLE: Error computing //cmake 包含的跨平台头文件或者是源文件路径出错

  3. 项目中有 xxxx 不能被json序列化

    遇到这类问题 ,首先断点调试,看看要序列化的值 是一个什么类型的值 查看值得数据类型 在将值转化成可以被json序列化的对象 此时即可解决问题 如遇到  requests.post() 朝一个url发 ...

  4. 线程join方法demo-模拟叫号看病

    package cn.chapter4.test5; public class SicknessDemo { /** * 模拟叫号看病 * @param args * * 思路:把普通号看病写在主线程 ...

  5. window系统命令cmd有哪些?

    CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本)chcp 修改默认字符集chcp 936默认中文chcp 650011. appwiz.c ...

  6. Mac查询电脑mac地址

    方法一: 按住键盘上的“Windows+R”,然后在弹出的运行框中输入“CMD”或依次点击 开始>所有程序>附件>命令提示符 在弹出的命令提示符窗口中输入“ipconfig /all ...

  7. 新建工程spring boot

    新建工程spring boot 使用Maven管理, 在官网(http://atart.spring.io)下载demo后,加入依赖 <dependency>         <gr ...

  8. ansible控制winserver笔记

    原文地址: https://www.cnblogs.com/kingleft/p/6391652.html 环境描述: ansible控制远程windows .系统必须是sp1 .安装framewor ...

  9. 26 October in 614

    Practice tower 有 \(N\,(2\le N\le 600000)\) 块砖,要搭一个 \(N\) 层的塔,要求:如果砖 \(A\) 在砖 \(B\) 上面,那么 \(A\) 不能比 \ ...

  10. 用 Flask 来写个轻博客 (27) — 使用 Flask-Cache 实现网页缓存加速

    目录 目录 前文列表 扩展阅读 Flask-Cache 应用 Flask-Cache 实现视图函数缓存 缓存无参数的普通函数 缓存带参数的普通函数 缓存无动态参数的视图函数 缓存带动态参数的视图函数 ...