字符串的不可变

  1. Demo
  2. Analysis
  3. 原来的字符串占用内存资源吗?该怎么删除它?

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是带垃圾收集的语言,它会自动判断哪些是没用的垃圾并清除,不需要我们自己去删除。


他の者にできたか?ここまでやれたか?この先できるか?いいや、仆にしかできない!

目录
×

喜欢就点赞,疼爱就打赏