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);
}
}

最新文章

  1. Git 常用命令2
  2. Js获取当前日期时间及其它格式化操作
  3. 给Debian浏览器安装flash播放插件
  4. 第二十篇、自定义UIButton(设置title和image的位置)
  5. list append 总是复制前面的参数,而不复制最后一个参数
  6. C# 单向链表数据结构 (一)
  7. codeforces 632D. Longest Subsequence 筛法
  8. 使用AjaxFileUpload.js实现文件异步上�
  9. jQuery获取Radio选择的Value值||两个select之间option的互相添加操作(jquery实现)
  10. HTML,JS禁止鼠标右键、禁止全选、复制、粘贴的方法
  11. HDU-4787 GRE Words Revenge 解题报告
  12. OR in Matrix
  13. 借助Bodymovin播放svg动画
  14. 许式伟:我与Go语言的这十年[转]
  15. css 选择器基础
  16. sort排序用法
  17. PentesterLab渗透演练平台
  18. 前端 html input标签 disable 属性
  19. hmac 算法模块
  20. 终于解决了Linux下运行OCCI程序一直报Error while trying to retrieve text for error ORA-01804错误

热门文章

  1. Ubuntu新建用户组
  2. Linux如何查看进程是否存活
  3. 02 spring security 自定义用户认证流程
  4. 接口参数校验之@Valid与BindingResult
  5. php ltrim()函数 语法
  6. 4412 PWM
  7. 4412 linux延时和时间
  8. 八、条件变量std::condition_variable、wait()、notify_one()、notify_all(粗略)
  9. Appium运行报错:No Chromedriver found that can automate Chrome &#39;39.0.0&#39;
  10. php7.0 新增运算符??