将数据复制到java中的引用(缺少指针问题)

时间:2010-07-19 20:32:44

标签: java reference copy pointers

所以我在java中有一个ArrayList。而我正在做的是创建一个包含更新值的新列表。但我想将这些新值放入原始的ArrayList中。这很重要,因为我将原始的arraylist引用传递给我不再有权访问的对象,但我需要保持其内容是最新的。有没有办法让java将内容复制到当前引用中?我希望这是有道理的。

另外,我宁愿不清楚原始的arraylist然后循环它将新内容推入其中。

我需要做这样的事情:

ArrayList a;
ArrayList *b = a;
//pass b (the pointer) to something
ArrayList c;
*b = c;

我真的希望我得到(伪)c ++代码正确或我看起来很傻= P

我可以看到我不清楚,它有点复杂(这是在Android中所以它涉及几个活动)所以让我看看我能否更好地理解我的观点。


Class1{
ArrayList a;
method1(){

a = Class2.getA();
method_that_uses_a(a);
}
}

Class2{
ArrayList getA(){

ArrayList a = new ArrayList

a = getDataFromWebsite();

return a;
}

Class1的method1()被另一部分代码定期调用。但我需要保留相同的引用,但内容要更改为新内容。

4 个答案:

答案 0 :(得分:1)

我认为你的问题不清楚,你是什么意思

“而我正在做的是创建一个包含更新值的新列表。但是我想将这些新值放入原始的ArrayList中。这很重要,因为我将原始的arraylist引用传递给了一个我没有的对象更长时间可以访问,但我需要保持其内容是最新的。有没有办法让java将内容复制到当前引用?我希望这是有道理的。“

当你这样做时

List a = new ArrayList
List b = a

你有一个ArrayList对象,以及对象a和b的两个引用。

另请注意,您可以使用addAll方法将一个集合的成员添加到另一个集合。请注意,我相信 addAll不会执行深层复制,因此如果您使用它,则两个列表都具有相同引用的副本。因此,如果列表a具有引用a1,a2,a3,并且你执行b.addAll(a),则b现在引用了a1 ... a3指向的对象...

答案 1 :(得分:0)

数组类都公开了public clone()方法,所以如果是 数组的浅拷贝就足够了

return (ElementType[]) myArray.clone();

制作一个简单易读的范例。如果“ElementType”是a 原始类型然后浅和深没有区别 复制,如果它是不可变的,那么执行深层复制将是 浪费。在其他一些情况下,您可以使用浅色副本 无论如何都想要(你希望接收器能够改变返回的 具有对主机对象可见效果的数组元素。)

如果您发现自己确实想要制作数组的深层副本 那么你可能想考虑一下你的设计是否可以改进;它 并不一定如此,但我不会感到惊讶。

答案 2 :(得分:0)

在Java中,我希望你们已经发现,所有变量都是引用。除此之外,这意味着除非将它们分配给一个对象,否则它们不会“指向”任何东西。你需要写:

ArrayList a = new ArrayList();

或者a'不指向'实际对象 - 它只是空。

如果你写:

ArrayList a = new ArrayList();
ArrayList b = a;
modify(b);
ArrayList c = b;

然后只有一个ArrayList。所有变量a,b和c都是指它。在“修改”方法中进行的任何修改都适用于它,并将反映在a,b和c的状态中。

答案 3 :(得分:0)

你是C ++代码说:

ArrayList a;            //make arraylist
ArrayList *b = a;       //set b to point to same arraylist as a
//pass b somewhere
ArrayList c;            //make arraylist
*b = c;                 //variable b in THIS PROGRAM now points to c. arraylist is unchanged.

您希望更新arraylist,而不是指向它的指针,因为该指针仅在当前上下文中“存在”。你传递arraylist的代码如果指针回到who-know-where现在指向它使用的同一个arraylist,则不会给出一个darn。这是其他代码关心的实际对象。要更新该对象,您只需调用其上的方法,例如a.add(bar)

还有更多内容。如果你调用一个你无法控制的函数(现在称为foo)并将它传递给一个arraylist,那就没关系了。但是如果你想从调用foo的代码更新它,你会遇到问题。想象一下,如果您正在使用的对象可能随时随机更改。可能会发生各种各样的坏事。如果您确实需要此功能(我们可以帮助您判断您是否这样做),请查看threading.

主题