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

System.out.println(a == c); //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
  • 如果是这样,为每个分配分配的内存何时再次空闲?
4

2 回答 2

3

d 的中间分配的内存分配发生了什么?

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

如果后续分配的字符数相同,这个答案会改变吗?(即,d="abc";d="rfb";)

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

是否为 d 的每次更改分配了新内存?

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

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

从理论上讲,如果要通过销毁 ClassLoader 来“卸载”类,那么可能会对 interned 文字进行 GC。

于 2013-05-24T07:50:41.493 回答
3

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

于 2013-05-24T07:39:45.677 回答