字符串的内存分配/管理及其后续的垃圾收集

时间:2013-05-24 07:35:35

标签: java string

String a = "test";
String b = "whatever";
String c= "test";

System.out.println(a == c); //true

我认为这打印为true,因为字符串是不可变的,因此这些字符串是相同的,因此Java会将c指向a在内存中的位置。

String a = "test";
String b = "whatever";
String c= new String("test");

System.out.println(a == c); //false

我假设通过调用new运算符,Java必须分配新的内存,因此它不能选择指向a

我的问题是:

String d="a";
d="rbf";
d="ergfbrhfb";
d="erhfb3ewdbr";
d="rgfb";
//...
  • 关于d的中间分配的内存分配情况如何?
  • 如果后续作业的字符数相同,此答案是否会改变? (即d="abc"; d="rfb";
  • 是否为d的每次更改分配了新内存?
  • 如果是这样,为每个作业分配的内存何时再次空闲?

2 个答案:

答案 0 :(得分:3)

在上一个示例中,没有内存分配或释放内存,字符串常量永久保留在字符串池的内存中,变量d将被赋予对这些字符串的不同引用。

答案 1 :(得分:3)

  

关于d?

的中间分配的内存分配情况如何?

由于赋值都是String文字,因此这些文字被编译到类中。基本上,文字字符串的处理方式与动态字符串(如用户输入)略有不同。

  

如果后续作业的字符数相同,此答案是否会改变? (即,d =“abc”; d =“rfb”;)

没有。在加载类时,字符串文字全部作为单独的对象实现。即使分配来自用户输入,答案仍然是否定的。 String的实例是不可变的。意味着不允许更改String的封装表示。因此,如果String例如是char[],则不允许任何操作更改char[]的元素。

  

是否为d?

的每次更改分配了新内存

不,再次,因为赋值是字符串文字,而不是字符串或任意输入数据的new个实例。

  

如果是这样,为每个作业分配的内存何时再次空闲?

理论上,如果要通过销毁ClassLoader来“卸载”Class,那么也许可以对被加入的文字进行GCed。