所以我在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()被另一部分代码定期调用。但我需要保留相同的引用,但内容要更改为新内容。
答案 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.
主题