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和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏
查看15道真题和解析