如何理解String的不可变性
String s1 = "abc";
执行上述代码时,JVM首先在运行时常量池中查看是否存在String对象“abc”,如果不存在该对象,则先在运行时常量池中创建一个新的String对象“abc”,然后将引用s1指向运行时常量池中创建的新String对象。
执行上述代码时,在运行时常量池中只会创建一个String对象"abc" 如下图:
String s1 = "abc";//字面量的定义方式
String s2 = "abc";
如果已存在该对象,则不用创建新的String对象“abc”,而是将引用s直接指向运行时常量池中已存在的String对象“abc” (如此,便节约了空间) 如下图:
s2 = "hello";
当执行上述代码时,原来的“abc”在运行时常量池中仍然不改变,而是在运行时常量池中创建一个新的String对象“123”,然后将引用s2指向运行时常量池中创建的新String对象。这便称为String的不可变性,具体实现见以下图片
总结:无论是对字符串重新赋值,还是对现有的字符串进行连接操作,或是调用String的replace()方法修改指定字符或者字符串时,都需要类似的执行上述操作