为什么String类型是不可变的?

这篇文章将对字符串的驻留做详细的解释和剖析。  引自:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/

鉴于个人水平和理解能力有限,请大神多多指导和提供不同的想法。

原文:这是一个很久以前就备受瞩目的问题,有很多原因导致String在Java中是不可变的量,首先要解决这个问题,取决于你对内存布局,同步问题,数据结构等有一个好的理解和清晰的认识,下面我们将以例子来总结这些。

1.字符串池的需要

字符串池(字符串驻留池)在Java堆中是一片特殊的存储区域,当一个字符串A被创建而这个字符串早已存在字符串池中时,那个已经存在的字符串B的引用将传递给A,而不是创建一个新的对象返回该对象的引用。

下面的代码将在堆中创建唯一的一个字符串的对象

String string1 = "abcd";
String string2 = "abcd";
看看他是怎么工作的:


如果字符串是固定的,改变一个字符串的引用将导致其他错误引用的值。

2.允许字符串记住哈希码的缓存

字符串的哈希码在Java中已经被广泛使用了,例如在HashMap中,不变的字符串保证了它的hashcode将总是那个,所以将不必担心赋值带来的改变,也就是说,当字符串使用时不必每一次计算hashcode的改变,效率会更高。

在String类(java.lang.String)中,有下面一段代码(参考JDK下面的SRC文件):

private int hash;//这个值将用来缓存哈希码的

3.安全

字符串在很多Java类中当做参数被广泛的使用,例如网络连接,开源文件等等,假如字符串是可变的。连接或文件将可能被修改进而遭受严重的安全威胁,下面这个方法是想让我们知道它的作用是连接到一台机器上,如果没有连接上,可变的字符串将在反射上面制造安全危机,字符串作为参数也有这样的危险。

下面代码举例:

boolean connect(string s){
    if (!isSecure(s)) { 
throw new SecurityException(); 
}
    //<span style="orphans: 2; text-align: -webkit-auto; widows: 2; font-family: Arial, Helvetica, sans-serif;"><span style="font-size:12px;">下面将导致危险,如果在使用其他引用后字符串已经被改变</span></span>
    
    causeProblem(s);
}


总之,字符串不可改变的原因有包括了设计,效率,安全。事实上,这也适用于在Java面试中的一些问题的解答,也会对其有帮助。

 




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值