字符串的不可变
Demo
Java的字符串有个重要特点,就是字符串不可变。下面的执行结果,看起来好像字符串改变了,实际上字符串是不改变的,改变的是变量s的 “指向” 。
public class Main {
public static void main(String[] args) {
String s = "hello";
System.out.println(s); // 显示 hello
s = "world";
System.out.println(s); // 显示 world
}
}
Analysis
执行 String s = "hello"
时,JVM虚拟机先创建字符串 “hello” ,然后把字符串变量s指向它;
s
│
▼
┌───┬───────────┬───┐
│ │ "hello" │ │
└───┴───────────┴───┘
紧接着,执行 s = "world"
时,JVM虚拟机先创建字符串 “world” ,然后把字符串变量s指向它;
s ──────────────┐
│
▼
┌───┬───────────┬───┬───────────┬───┐
│ │ "hello" │ │ "world" │ │
└───┴───────────┴───┴───────────┴───┘
原来的字符串 “hello” 还在,只是我们无法通过变量s访问它而已。因此,字符串的不可变是指字符串内容 “hello” 不可变,虽然无法改变字符串的值,但是我们可以让变量指向另一个不同值的字符串。
原来的字符串占用内存资源吗?该怎么删除它?
如上,我们将变量指向新的字符串后,原来的字符串 “hello” 还在,由于没有其他变量指向原来的字符串 “hello” ,那么需要担心 “hello”占用内存资源吗?该怎么删除它?
答案是不需要担心。所有带垃圾收集的语言都由垃圾收集器清理,不带的才自己清理,忘了自己清理就会造成内存泄漏。JAVA是带垃圾收集的语言,它会自动判断哪些是没用的垃圾并清除,不需要我们自己去删除。
他の者にできたか?ここまでやれたか?この先できるか?いいや、仆にしかできない!