gpt4 book ai didi

Java:设置对 null 的引用不会影响对象

转载 作者:搜寻专家 更新时间:2023-10-31 08:06:27 27 4
gpt4 key购买 nike

我有一个简单的问题。在下面的这段代码中,为什么我之前将 s3 的值设置为 null,但它仍然打印出来。看来垃圾收集器不会被调用。

public class Test {
public static void main(String[] args) {
String s1 = "abc", s2 = "def", s3 = "ghj";

String sarr[] = {s1, s2, s3};
s3 = null;

System.gc();

for(int i = 0; i < sarr.length; i++) {
System.out.print(sarr[i] + " "); //prints abc def ghj
}
}
}

如有任何想法,我们将不胜感激。

最佳答案

当你写的时候:

// Moved [] to make it more idiomatic
String[] sarr = {s1, s2, s3};

复制 s1s2s3 的值(它们是引用,不是 对象)放入数组中。语句执行后,变量完全独立于数组。更改任何 s1s2s3 变量的值以引用不同的字符串不会影响数组的内容全部。

这与其他作业完全相同,例如

string x = "hello";
string y = x;
x = null; // Doesn't affect y

还有方法参数。

请注意,这里的垃圾回收部分是一个转移注意力的问题 - 虽然显然理解这一点对于理解垃圾回收很重要,但反之则不然。重要的一点是要理解:

  • s1s2s3的值和数组的元素是引用,不是对象。
  • 值是在创建数组时复制的,因此之后更改变量没有任何区别

现在,让这个例子更进一步,考虑:

StringBuilder sb = new StringBuilder("Hello");
StringBuilder[] array = { sb };

sb.append(" world");
System.out.println(array[0]);

这将打印“Hello world”,因为这里我们只有一个 StringBuilder objectsb array[0] 引用。更改该对象 inside 的数据(这与更改 sb 以引用不同的对象不同)会使更改可见,无论您如何进行更改。这就像我把我家的地址给了两个人——如果其中一个人把我的房子漆成红色,另一个人也会看到。

关于Java:设置对 null 的引用不会影响对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8298216/

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