回答知识总结02
1、集合的分类必背关键字只记这些不容易乱两大主干Collection 单列、Map 双列List 关键词有序、可重复、有下标Set 关键词无序、不重复、无下标Map 关键词key-value、key 唯一超短考场口述话术Java 集合分成两大类Collection 单列集合每次存一个对象Map 双列集合存 key 和 value 一对数据。 Collection 又分 List、Set、Queue。List 有序可重复带索引Set 元素不能重复Queue 是先进先出队列。Map 的 key 不能重复可以通过 key 找 value。2、set怎么保证元素不重复必背极简关键字HashSethashCode 定位equals 判内容两者全同 重复TreeSet比较器返回 0 即为重复LinkedHashSet继承 HashSet去重逻辑和 HashSet 完全一致额外保留插入顺序考场一句话速答HashSet 先靠 hashCode 找位置再用 equals 比对内容全都一样就判定重复TreeSet 通过比较器对比结果为 0 则重复。3、Hash冲突解决方式必背极简关键字拉链法数组 链表 / 红黑树HashMap开放寻址往后空位找再哈希换哈希函数溢出区单独存冲突数据考场一句话速答主流四种拉链法、开放寻址、再哈希、公共溢出区。Java HashMap 使用拉链法冲突元素挂链表长链表转为红黑树。记忆小窍门拉链 挂链子开放寻址 挨个往后挪再哈希 换公式溢出区 单独小仓库。HashMap 认准拉链法。hashmap数据结构必背极简关键字JDK7数组 链表JDK8数组 链表 红黑树阈值 8 树化、阈值 6 退链考场一句话速答JDK1.8 的 HashMap 底层是哈希数组搭配链表链表长度到 8 且数组足够长就转红黑树节点少于 6 变回链表JDK1.7 只有数组加链表。记忆小窍门7 只有链表8 优化树化8 树 6 链平衡查询速度和维护成本。hashmap、hashtable、concurrentHashMap区别必背极简关键字HashMap不安全、可存 null、性能高 HashTable全表 synchronized、不可 null、低效淘汰 ConcurrentHashMap分段锁 (JDK7)/ 锁头节点 (JDK8)、线程安全、不可 null、并发最优。考场一句话速答HashMap 单线程最快线程不安全支持 nullHashTable 锁住整张表并发差、不能存 nullConcurrentHashMap 细分锁粒度保证安全多线程首选同样不允许 key/value 为 null。记忆小窍门HashMap 单线程专用HashTable 全上锁笨重ConcurrentHashMap 精准加锁安全又快三者只有 HashMap 能放 null。hashmap的set流程必背极简关键字判空初始化→算 hash 找下标空则直接存key 重复覆盖冲突链表 / 红黑树追加链表 8 树化超阈值扩容考场一句话速答先初始化数组通过 hash 定位下标空位直接存入key 重复覆盖 value冲突挂链表或红黑树链表过长转红黑树元素总数超标就扩容。记忆小窍门找位置→有空就放重了替换冲突挂链链长变树装太满扩容。hashmap cap2^n为什么怎么保证必背极简关键字原因hash (len-1)高效取模非 2 次幂冲突暴增 保证tableSizeFor 向上凑 2 次幂默认 16扩容翻倍考场一句话速答为了用位运算替代取模提升效率减少哈希冲突依靠 tableSizeFor 函数自动修正容量加上每次扩容翻倍全程保证容量是 2 的 n 次方。记忆小窍门位运算更快len 全 1 才能均匀散列随便给的容量靠 tableSizeFor 凑成 2 次方扩容乘 2 永久合规。hashmap hash方法实现必背极简关键字0.75 折中太大冲突多太小频繁扩容费内存泊松分布碰撞最低考场一句话速答0.75 平衡内存利用率和哈希冲突值太高冲突多查得慢值太低扩容频繁浪费内存统计学上该数值碰撞概率最低。记忆小窍门大 塞太满打架多小 空太多总搬家0.75 刚刚好兼顾省钱和速度。concurrentHashMap怎么实现的必背极简关键字JDK7Segment 分段锁ReentrantLock 锁分段 JDK8无分段CASsynchronized 锁桶头节点结构同 HashMap多线程扩容。考场一句话速答JDK7 依靠 Segment 分段锁提升并发JDK8 去掉分段用 CAS 配合 synchronized 锁住哈希数组单个桶首节点结构和 HashMap 一致读写并发效率更高。记忆小窍门7 分大块上锁8 精准锁小格子无锁读、CAS 插空、有节点锁头结点。cop yonwtitle ArrayList是什么怎么实现的必背极简关键字写时复制读无锁、写加锁复制新数组弱一致性读多写少适用三、考场一句话速答CopyOnWriteArrayList 是线程安全 List读取不加锁增删改加锁并复制新数组完成修改适合读多写少遍历不会报并发修改异常。四、记忆小窍门读随便读写先复制、改新数组再换引用多读少写才好用写多容易卡。