Java 列表相等,以及Collections.shuffle(List)方法

Java 列表相等,以及Collections.shuffle(List)方法,java,list,collections,equals,shuffle,Java,List,Collections,Equals,Shuffle,根据Java文档 。。。如果两个列表包含相同顺序的相同元素,则它们被定义为相等 有人能解释一下为什么下面的代码输出是相等的吗?我不明白为什么两份名单都被洗牌了 unshuffledPlaylist = sqlHelper.findSongs(SQLHelper.NOW_PLAYING_TABLE, "", orderBy); shuffledPlaylist = unshuffledPlaylist; Collections.shuffle(sh

根据Java文档

。。。如果两个列表包含相同顺序的相同元素,则它们被定义为相等

有人能解释一下为什么下面的代码输出是相等的吗?我不明白为什么两份名单都被洗牌了

    unshuffledPlaylist = sqlHelper.findSongs(SQLHelper.NOW_PLAYING_TABLE,
            "", orderBy);
    shuffledPlaylist = unshuffledPlaylist;

    Collections.shuffle(shuffledPlaylist);

    if (shuffledPlaylist == unshuffledPlaylist){
        System.out.println("They're equal");
    }

因为您也在洗牌unsuffledPlaylist,因为它们指向相同的引用

您需要创建一个包含UnsuffledPlaylist内容的新对象


因为您也在洗牌unsuffledPlaylist,因为它们指向相同的引用

您需要创建一个包含UnsuffledPlaylist内容的新对象

您并不是在创建原始列表的副本,而是在使用shuffledPlaylist引用来保存与UnsuffledPlaylist相同的列表,以便最终它们都保存相同的列表。这就是为什么通过其中一个引用进行的每个修改都可以通过另一个引用看到

要基于原始列表创建单独的列表,可以使用复制构造函数

shuffledPlaylist = new ArrayList(unshuffledPlaylist);
Collections.shuffle(shuffledPlaylist);//now you can shuffle copy of original list
另外,若要检查两个列表或任何对象实例是否相等并具有相同的状态,请不要使用X==Y,因为==只需检查引用X和Y是否与您的情况相同。相反,您应该使用X.equalsY方法。

您并不是在创建原始列表的副本,而是在使用shuffledPlaylist引用来保存与UnsuffledPlaylist相同的列表,以便最终它们都保存相同的列表。这就是为什么通过其中一个引用进行的每个修改都可以通过另一个引用看到

要基于原始列表创建单独的列表,可以使用复制构造函数

shuffledPlaylist = new ArrayList(unshuffledPlaylist);
Collections.shuffle(shuffledPlaylist);//now you can shuffle copy of original list
另外,若要检查两个列表或任何对象实例是否相等并具有相同的状态,请不要使用X==Y,因为==只需检查引用X和Y是否与您的情况相同。相反,您应该使用X.equalsY方法。

findSongs函数创建一个列表对象。此对象使用内存,并存在于内存中的一个位置,即堆中

UnsuffledPlaylist只是对该对象的引用。它不是对象本身,只是获取对堆上对象的访问权的一种方式

下面的代码行

shuffledPlaylist = unshuffledPlaylist;
创建一个名为shuffledPlaylist的新引用,但它也引用堆上与UnsuffledPlaylist引用的对象完全相同的对象

因此,使用哪个引用洗牌列表对象并不重要

shuffledPlaylist和UnsuffledPlaylist引用的对象完全相同

以下陈述的含义

if (shuffledPlaylist == unshuffledPlaylist){
        System.out.println("They're equal");
}

如果是无序播放列表和非无序播放列表,请参阅 同一个物体,打印出来它们是相等的

它将更准确地输出

System.out.println("shuffledPlaylist and unshuffledPlaylist refer to the exact same object.");
findSongs函数创建一个列表对象。此对象使用内存,并存在于内存中的一个位置,即堆中

UnsuffledPlaylist只是对该对象的引用。它不是对象本身,只是获取对堆上对象的访问权的一种方式

下面的代码行

shuffledPlaylist = unshuffledPlaylist;
创建一个名为shuffledPlaylist的新引用,但它也引用堆上与UnsuffledPlaylist引用的对象完全相同的对象

因此,使用哪个引用洗牌列表对象并不重要

shuffledPlaylist和UnsuffledPlaylist引用的对象完全相同

以下陈述的含义

if (shuffledPlaylist == unshuffledPlaylist){
        System.out.println("They're equal");
}

如果是无序播放列表和非无序播放列表,请参阅 同一个物体,打印出来它们是相等的

它将更准确地输出

System.out.println("shuffledPlaylist and unshuffledPlaylist refer to the exact same object.");

因为您也在洗牌UnsuffledPlaylist,因为它们指向同一引用。或者,它们是对同一对象的两个引用。因为shuffledPlaylist和UnsuffledPlaylist是对同一对象的引用。有没有办法只洗牌其中一个?没有,只有一个。因为您也在洗牌UnsuffledPlaylist,因为它们指向同一个引用。或者,它们是对同一对象的两个引用。因为shuffledPlaylist和UnsuffledPlaylist是对同一对象的引用。有没有办法只对其中一个进行混洗?没有,只有其中一个。