为什么Java中的String是不可变的
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么Java中的String是不可变的,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2090字,纯文字阅读大概需要3分钟。
内容图文
原文出处:https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/
在Java中String类是不可变的,简单来说,一个不可变的类就意味着他的实例是不可修改的,实例的所有信息都是在实例创建的时候被初始化并且不可被修改。不可变类的设计有很多优点。这篇博文主要从内存,同步和数据结构的角度来具体说明这种不可变的概念。
String Pool的需要
String Pool(String intern pool)是在方法区的一块特殊存储区域。当一个String被创建时如果发现当前String已经存在于String Pool,则会返回一个已存在String的引用而不会新建一个对象。
以下代码只会创建一个String对象在堆内存中。
String string1 = "abcd"; String string2 = "abcd";
下图是创建的过程:
如果一个String是可变的,改变了一个引用指向的String会导致其他引用得到错误的值。
缓存Hashcode
在Java中,对于String的Hashcode使用是非常频繁的,例如在HashMap或HashSet中。将String设计成不可变可以保证他的Hashcode始终一致,这样Hashcode就可以被缓存并且不用担心变化。这就意味着,不需要在每次使用String的时候都去计算他的Hashcode,这也使得程序运行的更加高效。
在String类中,关于Hashcode的代码如下
private int hash;//this is used to cache hash code.
简化其他对象的使用
为了更加详细的阐述,我们考虑以下程序:
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的设计初衷(set包含不重复的元素)。当然,上面的例子只是为了论证,实际上String类中没有value这个字段。
安全
String在很多Java类中被广泛用作参数,例如网络连接,文件打开等。假设String是可变的,一个连接或者一个文件就可能被改变,这会导致严重的安全隐患。某个方法以为正在连接到一个机器,实际并没有。可变的String还可能在反射的时候引发安全问题,因为反射的参数类型也是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); }
不可变对象天生线程安全
因为不可变对象不能被改变,他们可以在多线程中被自由的共享,这就消除了对象同步的需求。
总的来说,String被设计成不可变的出发点是效率和安全。这也是不可变类在很多情况下被优先使用的原因。
内容总结
以上是互联网集市为您收集整理的为什么Java中的String是不可变的全部内容,希望文章能够帮你解决为什么Java中的String是不可变的所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。