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位也参与,让分布更均匀,减少冲突。
回答示例
HashMa

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

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

全部评论
感觉总结的很好呢
点赞 回复 分享
发布于 昨天 23:04 北京

相关推荐

评论
点赞
收藏
分享

创作者周榜

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