Simple Java—Strings and Arrays(三)为什么String被设计成了不可变型

Translate from Simple java

为什么String被设计成了不可变型?

1. 字符串池的需要

String string1 = "abcd";
String string2 = "abcd";

这里写图片描述
如果字符串是可变的,那通过一个引用改变字符串的值将会导致另外一个引用有了错误的值

2. hashcode的缓存化

String的hashcode经常被使用,例如,HashMap的key值。String的不可变性保证了hashcode一直是相同的,这样可以方便把String的hashcode放在缓存中而不用担心它的改变。这意味着,不用每次使用它时都计算它的hashcode,这是一个非常效率的做法

3. 方便其他对象使用

为了更具体的表现,思考一下下面的问题:

HashSet<String> set = new HashSet<String>();
set.add(new String("a"));
set.add(new String("b"));
set.add(new String("c"));

for(String a: set)
    a.value = "a";

在这个例子中,如果String是可变的,它的值可以改变,那set的设计(不包含重复的元素)将被违反。

4. 安全

String作为形参被广泛的运用在许多java类中,像网络连接,打开文件。如果String可变,一个连接或者文件可以被改变将导致严重的线程安全问题。下面是代码实例:

boolean connect(string s){
    if (!isSecure(s)) { 
throw new SecurityException(); 
}
    //here will cause problem, if s is changed before this by using other references.    
    causeProblem(s);
}


5. 不可变的对象天然线程安全

因为不可变的对象不能够被改变,它们能被多个线程自由的共享。这减少了synchronization的使用。
总之,String被设计成不可变是为了效率和安全的目的。这也是为什么不可变对象在通常使用中被偏爱的原因

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值