java面试题基本功 -面试必知必会系列
2022-02-16 14:58:22 10 举报
AI智能生成
登录查看完整内容
架构师必知必会系列- java基本功
作者其他创作
大纲/内容
clickhouse的索引
clickhouse为什么这么快
clickhouse
大数据
mysql的mvcc
mysql的间隙锁
数据库
g1停顿预测算法
g1用了哪些回收算法
G1是如何做垃圾回收的
G1
垃圾回收
Subtopic
JVM
consumer Rebalance
kafka
redis的扩容机制
redis
中间件
jdk7
jdk8
数据结构不同
拉链法
发生hash冲突时,新元素插入到链表头中,即新元素总是添加到数组中,就元素移动到链表中。
头插法
拉链法+红黑树
JDK8:发生hash冲突后,会优先判断该节点的数据结构式是红黑树还是链表,如果是红黑树,则在红黑树中插入数据;如果是链表,则将数据插入到链表的尾部并判断链表长度是否大于8,如果大于8要转成红黑树。
尾插法
遇到hash碰撞
链表为O(n)
红黑树一直是O(logn)
查询时间复杂度
在扩容resize()过程中,采用单链表的头插入方式,在将旧数组上的数据 转移到 新数组上时,转移操作 = 按旧链表的正序遍历链表、在新链表的头部依次插入,即在转移数据、扩容后,容易出现链表逆序的情况 。 多线程下resize()容易出现死循环。此时若(多线程)并发执行 put()操作,一旦出现扩容情况,则 容易出现 环形链表,从而在获取数据、遍历链表时 形成死循环(Infinite Loop),即 死锁的状态 。
由于 JDK 1.8 转移数据操作 = 按旧链表的正序遍历链表、在新链表的尾部依次插入,所以不会出现链表 逆序、倒置的情况,故不容易出现环形链表的情况 ,但jdk1.8仍是线程不安全的,因为没有加同步锁保护。
扩容时
jdk7和8的不同点
默认初始容量16
hashmap的“最大容量“其实是Integer.MAX_VALUE
最大容量
容量(capacity)
HashMap在其容量自动增加前可达到多满的一种尺度 a. 默认加载因子 = 0.75
加载因子越大、填满的元素越多 = 空间利用率高、但冲突的机会加大、查找效率变低(因为链表变长了)
加载因子越小、填满的元素越少 = 空间利用率小、冲突的机会减小、查找效率高(链表不长) 0.75是一个\"冲突的机会\"与\"空间利用率\"之间寻找一种平衡与折衷的选择
加载因子(Load factor)
扩容时resize(2 * table.length),扩容到原数组长度的2倍。
扩容机制
若key == null,则hash(key) = 0,则将该键-值 存放到数组table 中的第1个位置,即table [0]
key为null
jdk7和8的共同点
hashmap
jdk7和8的区别
ConcurrentHashMap
数据结构
java面试题基本功
收藏
0 条评论
回复 删除
下一页