Java的String为什么要设计成不可变类
Posted BBinChina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的String为什么要设计成不可变类相关的知识,希望对你有一定的参考价值。
字符串String在开发中是必然会使用到的,我们经常会对字符串进行内容修改,然而在Java中,String 类是一个不可变类,也即是在对象创建之后不可进行修改。
为什么Java 的String需要设计成不可变的呢?我们需要修改字符串时还得在新建一个String对象,这多耗费性能跟空间呀。
本质原因
字符串池的存在
字符串池(String Pool)是方法区中的一块存储空间,当创建一个字符串时,如果池中已经存在相同的字符串就会返回其引用,而不是在堆中创建一个新对象。(此处指的是字面量创建字符串,用new关键字创建的话,无论池中存不存在都会在堆中创建一个新对象)
String string1 = "abcd";
String string2 = "abcd";
string1 跟 string 2都指向同一存储空间。
如果string是可变的话,那么修改string1的内容时,也会影响到string2的内容,造成数据污染。
缓存Hasecode
Java中经常用到一个字符串的hashcode,例如在HashMap和HashSet中。不可变性保证同一个字符串对象的hashcode总是相同的,而在使用时不用考虑其是否发生改变。
这意味着不需要每次都计算一遍hashcode,使程序更加高效。
public final class String{
/** Cache the hash code for the string */
private int hash; // Default to 0
}
String成员 hash不需要再进行计算
不可变对象是线程安全的
同理,我们也可以根据以上优势设计不可变类
以上是关于Java的String为什么要设计成不可变类的主要内容,如果未能解决你的问题,请参考以下文章
Java String为什么是不可变类,StringBuffer与StringBuilder区别