如果我用Java返回一个列表,返回值是引用还是实际值?

如果我用Java返回一个列表,返回值是引用还是实际值?,java,collections,Java,Collections,非常不言自明:我需要修改我收到的ArrayList,但我希望原始列表保持不变 我知道这是非常基本的,我不知道为什么我不知道确切的答案。我想晚做总比不做好 它将是相同的ArrayList。如果你想要一份,你必须自己复印。如果ArrayList包含复杂对象,则不一定容易 您将有一个对原始ArrayList的引用 可以使用创建列表的浅表副本 如果需要深度复制,请查看。默认情况下,java中的所有内容都是引用。因此,是的,更改返回的arraylist将修改原始arraylist 为了防止出现这种问题,您

非常不言自明:我需要修改我收到的ArrayList,但我希望原始列表保持不变


我知道这是非常基本的,我不知道为什么我不知道确切的答案。我想晚做总比不做好

它将是相同的ArrayList。如果你想要一份,你必须自己复印。如果ArrayList包含复杂对象,则不一定容易

您将有一个对原始
ArrayList
的引用

可以使用创建列表的浅表副本


如果需要深度复制,请查看。

默认情况下,java中的所有内容都是引用。因此,是的,更改返回的arraylist将修改原始arraylist


为了防止出现这种问题,您必须创建原始版本的副本。使用.clone()方法进行此操作。

如果希望修改列表,但不想修改原始列表,则不应对在方法参数中收到的列表进行操作,因为您是对引用进行操作的。最好使用这样的方法:

public void modifyList(List myList) {
    myList.add("aaa"); // original *will* be modified
    List modifiable = new ArrayList(myList);
    modifiable.add("bbb"); // original will *not* be modified - only the copy
}

我认为java总是通过价值传递的

<> P>唯一记住的是,对象通过传递它们的地址值,或者引用它们,这使得它们看起来好像是通过C++术语引用传递的。因为本质上,您传递的是引用地址,而不是对象的副本。地址是按值传递的

因此,Java可以说它总是按值传递,因为即使在传递对象时,它也只是在堆堆栈上传递其内存引用的值,而不是目标对象的克隆/副本

Arraylist是一个对象,因此它将按值传递,因此传入的值将是对堆上原始Arraylist的引用。对函数中Arraylist的任何修改都将修改堆上的原始文件


我没有使用.clone()。我把这件事留给其他人来解决。同时,我将亲自去了解他们

@Felix浅拷贝是否意味着修改它将修改原始拷贝?这将破坏复制的目的。Java不是按引用传递的。可能是这样,但那是因为没有人真正使用过引用(除了一些C++程序员),因此你们不知道它意味着什么。引用(指针)是按值传递的-这在理论和实践上都是不同的。@efficiencyIsBliss:否。按照链接,它说:返回此ArrayList实例的浅层副本。(元素本身不会被复制。)因此对副本的更改不会修改原始对象,但对列表中包含的对象的更改会修改原始对象。@efficiencyIsBliss,我认为您需要对Java中的引用类型有更深入的了解
clone()
将为您提供一个新的
ArrayList
,它完全独立于旧的列表,但是,它将包含所有相同的引用。修改一个列表不会影响另一个列表。但是,如果两个列表引用的对象都被修改了,那么通过对它的任何引用,当然可以看到更改。@Felix:Kling:好吧,因为没有人真正知道“通过引用传递”是什么意思,我们不妨劫持它,并将其用于更常见的语义;)说真的,通过引用传递意味着您可以设置调用者的变量,而不是其他任何符号-我们不应该将其用于任何其他用途。在某些情况下,这可能并不重要,但这仍然是一件完全不同的事情。默认情况下,您可以删除。Java在对象上只有指针(或引用)。实际上@unreputable,这是一个绝招。