为什么String的值无法改变或修改?
- String 类是不可改变的解析,例如:
String s = "Google";
System.out.println("s = " + s);
s = "Runoob";
System.out.println("s = " + s);
输出结果为:
Google
Runoob
从结果上看是改变了,但为什么说String对象是不可变的呢?
原因在于实例中的 s 只是一个 String 对象的引用,并不是对象本身;
当执行 s = "Runoob"; 创建了一个新的对象 "Runoob",而原来的 "Google" 还存在于内存中。
- 据 jdk 的源码来分析。
字符串实际上就是一个 char 数组,并且内部就是封装了一个 char 数组,并且这里 char 数组是被 final 修饰的:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
String 中的所有方法都是对char 数组的操作;
char 数组改变,方法内部都会返回一个新的 String 实例。
3.字符串的创建
String str = "Runoob";
String 创建的字符串存储在公共池中
String str2=new String("Runoob");
而 new 创建的字符串对象在堆上
例如:
String s1 = "Runoob"; // String 直接创建
String s2 = "Runoob"; // String 直接创建
String s3 = s1; // 相同引用
String s4 = new String("Runoob"); // String 对象创建
String s5 = new String("Runoob"); // String 对象创建
s1/s2/s3 的引用指向的是常量池的一个地址;
回到第一点:
- s的改变只是s的引用地址改变了Google还是Google,只是常量池多了一个Runoob。
- 如果是值改变,那常量池应该只有一个对象,对象的值为Runoob
所以说String 值不可改变。
引用自:
https://www.runoob.com/java/java-string.html