繁体   English   中英

Java中的参考文献

[英]References in Java

我正在阅读有关如何仅在 java 中按值传递的信息,并且交换两个对象的内容的唯一方法是将 then 放入数组中...通过值传递对数组 object 的引用,然后使用该引用交换 0-1 数组位置。

但我对此还有一个问题:假设我创建了一个数组,例如:

List<Integer> array = new ArrayList<Integer>();
Integer a = new Integer(1);
array.add(a);

So my question is when i "add" an object to an array (in this case Integer object)...do I just store the reference to the object in the array or do I actually copy the content of the object in the array. ..

假设,假设我们在 java 中有一个“删除引用”语句,..那么这会保留数组中 object 的值吗?

List<Integer> array = new ArrayList<Integer>();
Integer a = new Integer(1);
array.add(a);
delete a;

那么数组仍然会保持正确的值吗?

当您list.add()时,您只是将引用放入列表中。

java“删除”引用的方法是不使用它,所以:

list.remove(a);
a = null;

现在它是一个孤儿,垃圾收集器将回收 memory(最终)。

只是做a = null; 对列表持有的参考和 Integer object 本身没有影响。

注意:列表不是数组。 Arrays 是与列表(或任何其他集合)非常不同的动物。

编辑以回答提问者的更多问题

ArrayList不是array ,它是List ,其实现使用内部数组(您无权访问)。

数组定义如下: Object[] array = new Object[5]; - 它有一个固定的大小 - 一旦它被创建,你就不能改变它的大小。 另一方面,列表可以根据需要增长(在内部,ArrayList 创建一个新的更大的数组并将其值复制到新数组中,并根据需要丢弃旧数组)。

像“复制” object 这样的任何操作都是通过引用完成的——只复制“指针”。 在 java 中,创建真正的“深层副本”称为“克隆”object,JDK 支持此概念 - 请参阅Clonable

假设,假设我们在 java 中有一个“删除引用”语句,..那么这会保留数组中 object 的值吗?

因为我们不知道这个假设的陈述在做什么,所以很难说。

您的 ArrayList 持有的是对 Integer object 的引用。 您对 object 的任何其他引用都指向完全相同的实例。

对于 Integer,这并没有太大的区别,因为 Integer 是不可变的。

尝试使用像 StringBuilder 这样的可变 object 来查看效果:

List<Object> array = new ArrayList<Object>();
StringBuilder a = new StringBuilder("xxxxxx");
array.add(a);

a.setLength(0);  // clear the contents

System.out.println(array.get(0));  // will not print "xxxxxx" anymore

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM