JDK面试题

1. 解决hash冲突的办法有哪些?HashMap用的哪种?

解决Hash冲突方法有:开放定址法、再哈希法、链地址法。HashMap中采用的是 链地址法 。

开放定址法基本思想就是,如果p=H(key)出现冲突时,则以p为基础,再次hash,p1=H(p),如果p1再次出现冲突,则以p1为基础,以此类推,直到找到一个不冲突的哈希地址pi。 因此开放定址法所需要的hash表的长度要大于等于所需要存放的元素,而且因为存在再次hash,所以只能在删除的节点上做标记,而不能真正删除节点。

再哈希法提供多个不同的hash函数,当R1=H1(key1)发生冲突时,再计算R2=H2(key1),直到没有冲突为止。 这样做虽然不易产生堆集,但增加了计算的时间。

链地址法将哈希值相同的元素构成一个同义词的单链表,并将单链表的头指针存放在哈希表的第i个单元中,查找、插入和删除主要在同义词链表中进行。链表法适用于经常进行插入和删除的情况。

2. 使用的hash算法?

h=key.hashCode() //第一步 取hashCode值 h^(h>>>16) //第二步 高位参与运算,减少冲突 return h&(length-1); //第三步 取模运算

在JDK1.8的实现中,优化了高位运算的算法,通过hashCode()的高16位异或低16位实现的:这么做可以在数组比较小的时候,也能保证考虑到高低位都参与到Hash的计算中,可以减少冲突,同时不会有太大的开销。

在解决 hash 冲突的时候,为什么选择先用链表,再转红黑树? 因为红黑树需要进行左旋,右旋,变色这些操作来保持平衡,而单链表不需要。所以,当元素个数小于8个的时候,采用链表结构可以保证查询性能。而当元素个数大于8个的时候并且数组容量大于等于64,会采用红黑树结构。因为红黑树搜索时间复杂度是 O(logn),而链表是 O(n),在n比较大的时候,使用红黑树可以加快查询速度。

3. HashMap默认加载因子是多少?为什么是 0.75?

Node[] table的初始化长度length为16,默认的loadFactor是0.75,0.75是对空间和时间效率的一个平衡选择,根据泊松分布,loadFactor 取0.75碰撞最小。一般不会修改,除非在时间和空间比较特殊的情况下 :如果内存空间很多而又对时间效率要求很高,可以降低负载因子Load factor的值 。如果内存空间紧张而对时间效率要求不高,可以增加负载因子loadFactor的值,这个值可以大于1。#

相关推荐
洗澡水加冰18 分钟前
n8n搭建多阶段交互式工作流
后端·llm
陈随易20 分钟前
Univer v0.8.0 发布,开源免费版 Google Sheets
前端·后端·程序员
六月的雨在掘金25 分钟前
通义灵码 2.5 | 一个更懂开发者的 AI 编程助手
后端
朱龙凯1 小时前
MySQL那些事
后端
Re2751 小时前
剖析 MyBatis 延迟加载底层原理(1)
后端·面试
Victor3561 小时前
MySQL(63)如何进行数据库读写分离?
后端
Cache技术分享1 小时前
99. Java 继承(Inheritance)
前端·后端
M1A11 小时前
Python数据结构操作:全面解析与实践
后端·python
程序员蜗牛1 小时前
Controller层代码瘦身70%!5招打通任督二脉,效率飙升
后端
程序员岳焱1 小时前
Java高级反射实战:15个场景化编程技巧与底层原理解析
java·后端·编程语言