26年2月联想弘扬科技 Java开发工程师 一面

1. String类被final修饰对字符串常量池的安全性有何保障?

思路

从不可继承、不可变、安全共享这三点,说明final如何保证字符串常量池不被篡改、安全复用。

回答示例

面试官您好,String被final修饰,首先它不能被继承,就没办法通过子类去破坏它的行为。

然后它内部存储字符的数组又是private final,一旦创建就不能修改,保证字符串完全不可变。

不可变之后,常量池里的字符串就可以被任意地方安全共享,不会被意外篡改,哈希值也稳定,线程也安全。

所以final本质上是保证了字符串不可变,从而让常量池能够安全、高效、无风险地工作。

2. ArrayList的elementData数组为何用transient修饰?序列化时如何处理?

思路

讲elementData有冗余空间,默认序列化浪费,所以用transient关掉,再讲自定义序列化只存有效数据。

回答示例

因为ArrayList底层的elementData数组是带容量的,里面经常有很多null元素。

如果直接序列化,会把整个数组包括空位置都序列化出去,非常浪费空间和性能。

所以用transient修饰,让它不参与默认序列化。

然后ArrayList自己重写了writeObject和readObject方法,序列化的时候只写出实际有效的元素,反序列化的时候再把元素恢复回来,这样效率最高、体积最小。

3. HashMap中扰动函数(hash ^ (hash >>> 16))的设计目的?

思路

说明数组长度不大时只有低几位参与计算索引,扰动函数让高16位也参与,让分布更均匀,减少冲突。

回答示例

HashMap计算索引的时候,是用哈希值和数组长

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务