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要把字符串设计成不可变的嘛!

Java String为什么是不可变类,StringBuffer与StringBuilder区别

java中String为什么设计成不可变对象

Java String类为什么不可变?

Java为什么把String设计成不可变的(immutable)

从字节码和JVM的角度解析Java核心类String的不可变特性