代码之家  ›  专栏  ›  技术社区  ›  Falmarri

用Java将数据复制到引用中(指针问题缺失)

  •  1
  • Falmarri  · 技术社区  · 14 年前

    所以我在Java中有一个数组。我要做的是用更新的值创建一个新的列表。但我想把这些新值放入原始数组列表中。这很重要,因为我正在将原始的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;
    }
    

    类1的method1()被代码的另一部分定期调用。但我需要参考的是一个保持不变的,但内容要改为新的内容。

    4 回复  |  直到 14 年前
        1
  •  1
  •   hvgotcodes    14 年前

    我觉得你的问题不清楚,你说的是什么意思

    “我要做的是用更新的值创建一个新列表。但我想把这些新值放入原始数组列表中。这很重要,因为我正在将原始的ArrayList引用传递给一个我不再有权访问的对象,但我需要保持它的内容是最新的。有什么方法可以让Java将内容复制到当前引用中吗?我希望这是有道理的。”

    当你这样做的时候

    List a = new ArrayList
    List b = a
    

    您有一个arraylist对象,以及对该对象的两个引用:a和b。

    还要注意,有一个addall方法,您可以使用它将一个集合的成员添加到另一个集合。注意我 相信 addall不做深度复制,因此如果使用它,两个列表都有相同引用的副本。所以,如果列表A引用了A1、A2、A3,而您引用了B.AddAll(A),那么B现在引用了A1…A3指向的对象…

        2
  •  0
  •   ayush    14 年前

    然而,数组类都公开了public clone()方法,因此如果 那么数组的浅拷贝就足够了

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

    创建一个好的、简单的、易读的范例。如果“elementtype”是 那么原始类型就没有浅与深的区别了。 复制,如果它是不可变的,那么执行深度复制将是 浪费的在其他情况下,你只需要一份浅薄的副本 无论如何都要(您希望接收器能够改变返回的 数组元素,其效果对宿主对象可见)。

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

        3
  •  0
  •   DJClayworth    14 年前

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

    ArrayList a = new ArrayList();
    

    或者a没有指向一个实际的对象——它只是空的。

    如果你写:

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

    那么只有一个数组列表。所有的变量a、b和c都指向它。在“修改”方法中所做的任何修改都适用于它,并且将反映在A、B和C的状态中。

        4
  •  0
  •   Gordon Gustafson    14 年前

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

    但是 还有很多。如果调用一个不控制的函数(现在称为foo),并将其传递给arraylist,那就没问题了。但是如果您想从调用foo的代码中更新它,就会遇到问题。想象一下,如果你正在处理的对象可以随机改变 随时 . 各种各样的坏事都有可能发生。如果你真的需要这种能力(我们可以帮助你判断你是否需要),请研究 threading.