gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:11:45 24 4
gpt4 key购买 nike

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 的每次更改分配新内存?
  • 如果是这样,为每个分配分配的内存何时再次释放?

最佳答案

What's going on with respect to the memory allocation of the intermediary assignments to d?

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

Does this answer change if subsequent assignments are of the same number of characters? (ie, d="abc"; d="rfb";)

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

Is new memory being allocated for each change to d?

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

If so, when does the memory allocated for each assignment become free again?

理论上,如果通过销毁 ClassLoader 来“卸载”该类,那么也许可以对内部文字进行 GC。

关于java - 字符串的内存分配/管理及其后续垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16729881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com