笔试题总结——String对象的"不可变性"
程序员文章站
2022-05-08 19:42:25
...
笔试题总结——String对象的"不可变性"
String类的内部是基于char[]实现的,但String内部并没有提供set之类的方法用以修改内部字符数组。
字符串是一种不可变对象. 它的内容不可改变。
由于String对象的内容(对象内存地址所存的内容
)是不能改变的,但String引用(变量)
是可以改变的,可以让其指向另外一个字符串。(不能修改字符串的内容,但可以修改字符串的引用
)
举个栗子
String str = "hello";
str = str + " world";
str += "!!!";
System.out.println(str);
// 执行结果
hello world!!!
这段代码的背后,实际上并没有直接修改堆上的"hello"所处的内存空间
,而是在堆上重新创建了一块内存空间,新创建的内存空间中保存着"+“操作后的字符串"hello world”,此时将字符串的引用str指向新的内存空间
,原来的内存空间若没有其他引用(除str外)指向就会被GC所回收。
画个图在理解一下Java中String类型的"+"操作。
也就是说,虽然str打印的结果变了,但不是String对象本身发生改变,而是str引用到了其他String对象
。要区分修改的是"地址"还是"地址对应内存的内容"。
因此,尽量减少对字符串的改变操作。
// 错误用例:产生大量的垃圾空间。
String str = "hello" ;
for(int x = 0 ; x<1000 ; x++) {
str += x ;
}
System.out.println(str);
如果非要修改String字符串怎么办?
1、常用方法:借助原字符串,创建新的字符串(依旧是更改了str的地址)
String str = "hello";
str = "h" + str.substring(1);
System.out.println(str);
// 执行结果
hello