将ArrayList值分配给另一个

时间:2013-04-27 19:27:40

标签: java arraylist

我有很多函数将全局ArrayList作为参数,其中一些不对此列表进行任何更改,而其他函数需要在工作时删除此数组的某些元素,因此我在其中创建一个本地tempArrays这些功能。

static ArrayList array1 = new ArrayList();

public fn1(ArrayList array1)
{
   ArrayList tempArray1 = new ArrayList();
   tempArray1 = array1;
   tempArray1.remove(elemnt);
}

问题是删除的元素也从原始arrayList array1中删除,我不知道为什么?

谢谢..

8 个答案:

答案 0 :(得分:6)

排队:

tempArray1 = array1;

您正在使用tempArray1变量来引用ArrayList引用的array1的同一对象。因此两者都引用ArrayList的相同对象。使用任何变量在ArrayList对象中进行的任何更改都将由两个变量反映出来。因此,当您使用:

删除元素时
tempArray1.remove(elemnt);

array1也反映了元素的删除。

您应该使用:

ArrayList tempArray1 = new ArrayList(array1);

正如官方文档中所述:ArrayList(Collection<? extends E> c)

  

构造一个包含指定集合元素的列表,   按照它们由集合的迭代器返回的顺序。

     

参数:       c - 要将其元素放入此列表的集合

答案 1 :(得分:4)

问题在于声明tempArray1 = array1;只会使tempArray1成为array1的引用。 要创建真实副本,请调用:

ArrayList tempArray1 = new ArrayList(array1);

答案 2 :(得分:2)

尝试执行以下操作

List tempList = new ArrayList(oldArrayList);

答案 3 :(得分:2)

从原始ArrayList中删除项目的原因是,在Java中,引用类型的变量(数组,字符串以及其他任何其他的{{1}的子类1}})按住引用,而不是值。这实际上意味着类型Object的变量保存了分配ArrayList数据的内存地址。执行ArrayList后,您只需提供tempArray1 = array1;相同tempArray1的地址即可。这一切仅适用于从Java中ArrayList派生的类型,如果您不知道,它恰好包含Object原始类型(Stringbyteshortintlongchar,{{1} })存储为值。

现在,解决你真正的问题;我必须问,为什么你不只是使用float方法来处理这个项目?

如果您需要实际删除元素,请使用double的复制构造函数,如下所示: get(index)

答案 4 :(得分:2)

我认为你有一些被误解的Java:

  1. 声明Java变量时,它是对象的重新引用,就像C / C ++中的指针一样。它可以是先前创建的对象的参考,也可以创建一个新的对象来进行referance。

    //Created a new object instance on heap
    ArrayList tempArray1 = new ArrayList();
    //Both tempArray1 and tempArray2 will point to same object in memory
    ArrayList tempArray2 = tempArray1;
    

    在您的代码中,您首先要创建一个新的ArrayList对象referance tempArray1并为其创建一个新对象ArrayList tempArray1 = new ArrayList();,然后通过{{1}为此referance分配其他参考资料}。因此,您创建的第一个对象没有指向它的引用,将被删除。现在tempArray1和tempArray2都指向同一个对象。

  2. 在Java中如果要复制对象,可以使用它tempArray1 = array1;方法(如果已实现clone接口)。另请查看此问题,了解有关克隆的详细解答How do I copy an object in Java? 所以你想制作一个阵列的副本,但你做错了。

答案 5 :(得分:1)

您正在使用全局实例替换您创建的实例。试试这个:

ArrayList tempArray1 = new ArrayList(array1);
tempArray1.remove(elemnt);

答案 6 :(得分:1)

您也可以使用addAll(Collection c)方法

static ArrayList array1 = new ArrayList();

public fn1(ArrayList array1)
{
   ArrayList tempArray1 = new ArrayList();
   tempArray1.addAll(array1);
   tempArray1.remove(elemnt);
}

答案 7 :(得分:1)

A)tempArray1是一个变量,它将相同的实例称为array1。要制作副本,请使用复制构造函数:

List tempArray1 = new ArrayList(tempArray1);

B)从方法中删除参数。无需传递列表 - 方法中的代码已经具有对列表的访问权限。事实上,通过使用具有相同名称的参数传递它,您阴影原始列表 - 如果传入了不同的列表,您将使用它而不是您认为的列表正在与之合作。

C)您应该输入您的列表,例如:

static ArrayList<String> array1 = new ArrayList<String>();

D)始终使用抽象类:将其更改为List:

static List<String> array1 = new ArrayList<String>();

E)列表不是数组,所以不要调用变量“array1” - 它具有误导性:

static List<String> list1 = new ArrayList<String>();