鸭鸭今天上网冲浪的时候刷到,联想包括上海ISG在内的多个部门启动优化工作。
年底了,真的是到了各种“广进”的时候。
据说大会 15 分钟,不仅迟到了 13 分钟,几乎是只放了一段 2 分钟的录音宣布裁员,就结束会议。完全没给员工反应和沟通的机会。

前几个月就陆陆续续有消息传联想裁员,但没想到,居然裁得这么突然,而且影响范围这么大。据说连孕期女职工都在裁员范围内。
网传赔偿金有 N + 2 和 N +(3 - 6 )两个版本,不过也有看到吐槽“赔偿不像美式的”,不知道最终赔偿会是多少。
另外也有一些认证信息为联想员工的爆料称,这次裁员不仅涉及上海,中国区软件、固件和 OS 全部裁撤,涉及北京、上海、天津和深圳多个城市。
当然也有人觉得,“钱到位就行”。
不过目前这个就业形势下,大礼包再到位,对于很多同学来说,也很难接受。更何况临近年底,此时离职,年终奖怎么办?
不知道大家怎么看?
……
今天分享一篇杭州袋鼠云java一面面经

篇幅有限,完整答案可以进入面试鸭 - 程序员求职面试刷题神器,高频编程题目免费刷进行查阅。
在 Java 中,Hashmap 的工作原理是什么?
HashMap 说白了,底层就是一个数组,然后结合了链表和红黑树来解决冲突。
它的工作原理其实很简单,主要说这 3 点:
1)怎么存(寻址):
当你存一个 Key-Value 时,它会先算 Key 的 hashCode,然后通过一个算法(table.length-1) & hash)算出这个 Key 应该放在数组的哪个下标位置。
2)冲突了怎么办(哈希冲突):
如果两个不同的 Key 算出来的下标一样,这就叫哈希冲突。
HashMap 的解决办法是:
- 链表:先把它们串在一起,形成一个链表(Java 7 及以前一直是这样)。
- 红黑树:Java 8 做了优化,如果同一个下标下的链表太长了(超过 8 个),查起来太慢,就会把它转成红黑树。这样查找速度就从“挨个问(O(n))”变成了“二分查找(O(logn))”级别的速度,快很多。
3)扩容机制:
数组长度是有限的,存的数据多了肯定挤。HashMap 有一个负载因子(默认 0.75),意思是当数组用了 75% 的时候,它就会自动扩容。
扩容就是把数组大小翻倍,然后把所有数据重新算一遍位置(Rehash),放到新数组里。注意:这个操作挺耗性能的,所以初始化时最好直接给个大概容量,少扩容。
总结一下就是:HashMap 底层是数组加链表,Java 8 引入了红黑树优化。存取时通过哈希算法定位下标,遇到冲突就用链表或红黑树解决。为了保证性能,达到阈值会扩容。
注意:它是非线程安全的。如果在多线程环境下用,可能会出问题(比如数据覆盖或者死循环),这时候应该用
ConcurrentHashMap。
为什么 HashMap 和 ConcurrentHashMap 的 key 可以或不可以设置为 null?
HashMap 是允许 key 和 value 为 null 的。但不同实现类对 null的支持存在差异。
Java 的 ConcurrentHashMap 不支持 key 或 value 为 null。
这是为了避免混淆和潜在的并发问题。
ConcurrentHashMap 是为并发环境设计的,在并发访问时,如果允许 key 或 value 为 null,可能导致不可预知的行为和错误。例如,在使用 get(key) 时,如果返回值为 null,无法区分是 key 不存在,还是 value 实际上是 null。因此,为了避免这种歧义,ConcurrentHashMap 不允许 null 值。
为了简化实现。
如果 key 或 value 允许为 null,会给诸如 put、get、containsKey 等操作带来复杂性。例如,get 操作可能会频繁返回 null,需要额外的逻辑去区分是否是因为 key 不存在,还是 value 为 null。
如果允许 null,在并发修改或删除操作时,也可能导致多线程下不一致的状态,增加调试和维护的难度。
1198

被折叠的 条评论
为什么被折叠?



