java - java中的二维数组列表(为什么集合最终相同)

标签 java

我有一个 2D ArrayListArrayList 包含 10 个 ArrayList。我尝试了以下代码:

这是主要的 2D ArrayList。在主ArrayList内部有10个ArrayList:

 ArrayList<ArrayList<Items>> arrayList = new ArrayList<ArrayList<Items>>();

在这里,我尝试创建其中一个 ArrayList 的副本(selectedRow 只是一个数字,表示我得到的是哪个 ArrayList)

ArrayList<Items> newList = new ArrayList<Items>(arrayList.get(selectedRow));

之后我创建另一个ArrayList:

   ArrayList<Items> changeList = new ArrayList<Items>(it.returnTheNewArrayList(newList,randomItem));

然后在另一个类中我创建了这个方法。此方法的目的是更改其中一个对象的属性。

public  ArrayList<Items> returnTheNewArrayList(ArrayList<Items> a,int item){

  int randomBin = r.nextInt(50);

    for(Items i:a){

        if(item==i.itemIds()){

            while(randomBin==i.bins()){
                randomBin = r.nextInt(50);

            }
            i.setBin(randomBin);

        }

    }
return a;

}

最后,我在 2D ArrayList 中设置了新的 ArrayList

arrayList.set(whichList, changeList);

这是程序。我发现,当我运行此过程时,newListchangeList 是相同的。在这两个 ArrayLists 中,我都保存了在方法 returnTheNewArrayList 中所做的更改(我通过调试发现了这一点)。但我只想更改一个(changeList)。

我做错了什么?

最佳答案

列表包含对对象的引用。当您调用 i.setBin(...) 时,(大概)会对对象本身进行更改。

每个列表都有一个独立的引用副本 - 因此您可以从一个列表中删除一个元素而不影响另一个列表 - 但它们只是引用。

想象一下,您给了两个人剪贴板,上面有相同的家庭地址列表。一个人去把剪贴板上的每栋房子的前门都涂成红色,然后第二个人参观了所有相同的房子。第二个人会看到红色的门,不是吗?这里也是一样的。 列表包含引用,而不是对象。

如果您希望列表完全独立,则需要使用对不同对象的引用来填充它们。

编辑:我刚刚注意到您需要更改您的returnTheNewArrayList方法,该方法实际上甚至没有创建一个新的ArrayList 首先!

public ArrayList<Items> returnTheNewArrayList(ArrayList<Items> a,int item) {
    // Stuff which doesn't change the value of a...

    return a;
}

同样,a 的值只是列表的引用...因此,当您返回相同的引用时,您不会返回 >新的ArrayList根本。

您确实需要了解引用和对象在 Java 中的工作原理 - 这对于使用该语言绝对至关重要

关于java - java中的二维数组列表(为什么集合最终相同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9403790/

相关文章:

java - Connection.isValid(time) 实际上做了什么来检查连接是否有效?

java - 将属性文件值与数据库中的数据耦合是一种反模式吗?

java - 创建所有排列数组的排列算法

java - 有没有办法用 Hibernate/JPQL 查询 PostgreSQL hstore?

java - 如何修复 : Google Play services out of date. 需要 12210000 但找到 10298470

java - 包装 JFrame 列表

java - if 语句不遵守的规则

java - 如何将消息发送到 IBM MQ 集群中不同队列管理器和主机名中托管的不同队列

java - 类型 'jint' 无法解析,以及 JNIEnv、jclass

java - 使用 Java API 的 Couchbase 回退