java字符串如何实现不变性?
在一次采访中,我被问到“字符串是如何变为不可变的?” 由于我不确定答案,我没有回答。我后来问了面试官同样的问题。答案是字符串类是最终的,这就是实现不变性的方法
这是正确答案吗?如果是,即使StringBuffer也被标记为final类。那么为什么StringBuffer不是不可变的呢
你可以在下面搜索框中键入要查询的问题!
在一次采访中,我被问到“字符串是如何变为不可变的?” 由于我不确定答案,我没有回答。我后来问了面试官同样的问题。答案是字符串类是最终的,这就是实现不变性的方法
这是正确答案吗?如果是,即使StringBuffer也被标记为final类。那么为什么StringBuffer不是不可变的呢
# 1 楼答案
final
关键字与不变性不同String
是不可变的,因为它没有定义任何允许用户更改其内容的方法,它是最终的,消除了在子类中更改内容的可能性使
List
实例变量final这样的东西仍然允许您更改其内容,使其可变# 2 楼答案
字符串是不可变的对象
遵循以下准则使类不可变:
final
,或者使用静态工厂并保持构造函数私有private
和final
setXXX
方法,还有任何可以改变状态的方法 如果类有任何可变的对象字段,那么在类与其调用方之间传递时,必须对它们进行防御复制setXXX
方法的后续调用(也就是说,避免使用JavaBeans约定)# 3 楼答案
最初为空的字符串池由类字符串私下维护
你应该看看JavaDoc的字符串:
public native String intern();
见:
# 4 楼答案
作为最终的意思是它不能从中派生出来。这并不意味着不变性
不变性是通过封装实现的,不提供任何方法来修改内部保存的字符数组。也就是说,不存在修改内部字段的方法
# 5 楼答案
不,这不是正确答案。字符串实现了不变性,因为它不提供任何方法来更改其内部内容。因此,你可以实例化一个字符串对象,给它分配一个引用,但是一旦初始化,就不能改变它的内容
# 6 楼答案
它是以下因素的组合:
set
方法,因此也不能间接更改它们李>String
是final
——所以你不能给它添加可变性(如setter等)李>