gpt4 book ai didi

Java 堆和按值传递

转载 作者:行者123 更新时间:2023-11-29 09:49:09 24 4
gpt4 key购买 nike

对于我的 Java 程序如何分配内存,我有点困惑。下面是我程序中的一个典型情况。我在一个类内的堆上创建了一个对象,我将其传递给其他类内的其他函数。

public class A {
private List<Integer> list = new ArrayList<Integer>();

public A() {
for(int i = 0; i < 100; i++)
list.add(i);
}

public void foo() {
B b = new B();
b.bar(this.list);
}
}

public class B {
A a = new A();

public int bar(List<Integer> list) {
list.add(-1);
return list.size();
}

public int getSize() {
List<Integer> list = a.list;
return a.size();
}
}

我的问题是关于内存的使用方式。当 A 的列表传递给 B.bar() 时,内存是否被复制? Java 是按值传递的,所以我假设 B.bar() 函数现在包含列表的副本,该副本也在堆上分配?还是复制列表并将其放入堆栈?或者列表是否重复?同样,什么适用于 B.getSize() 内部的这些内存问题?

最佳答案

在 Java 中这样说可能更清楚,object references are passed by value .

因此 B 获得了列表的引用(这是一个值)的副本,但不是列表本身的副本。

您可以通过让 B 修改列表(通过添加或删除某些内容)并观察 A 的列表也发生变化(即它是同一个列表)来轻松地向自己证明这一点。

但是,如果您更改 B 对列表的引用(通过创建新列表并将其分配给它),A 的引用将保持不变。

关于Java 堆和按值传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13537033/

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