根据Java文档,
...如果两个列表包含相同顺序的相同元素,则它们被定义为相等。
有人可以解释为什么以下代码输出“他们是平等的”吗?我无法理解为什么两个名单都被洗牌了。
unshuffledPlaylist = sqlHelper.findSongs(SQLHelper.NOW_PLAYING_TABLE,
"", orderBy);
shuffledPlaylist = unshuffledPlaylist;
Collections.shuffle(shuffledPlaylist);
if (shuffledPlaylist == unshuffledPlaylist){
System.out.println("They're equal");
}
答案 0 :(得分:2)
用
shuffledPlaylist = unshuffledPlaylist;
您没有创建原始列表的副本,但是您要shuffledPlaylist
引用与unshuffledPlaylist
保持相同的列表,所以最后它们都保持相同的列表。这就是为什么通过其中一个引用完成的每个修改都可以通过其他参考查看。
要根据原始列表创建单独的列表,您可以使用复制构造函数
shuffledPlaylist = new ArrayList(unshuffledPlaylist);
Collections.shuffle(shuffledPlaylist);//now you can shuffle copy of original list
另外,要检查两个List
(或任何对象)实例是否相等(具有相同的状态),请不要使用X==Y
因为==
只检查引用X
和Y
持有相同的对象(就像你的情况一样)。相反,您应该使用X.equals(Y)
方法。
答案 1 :(得分:1)
因为你也在洗牌unshuffledPlaylist
,因为他们指的是相同的参考。
您需要创建一个包含unshuffledPlaylist
。
shuffledPlaylist = new ArrayList<>(unshuffledPlaylist);
答案 2 :(得分:1)
findSongs
函数创建一个列表对象。此对象使用内存并存在于内存中的某个位置 The Heap
unshuffledPlaylist
只是对该对象的引用。它不是对象本身,它只是获取对堆上对象的访问权的一种方式。
以下代码行......
shuffledPlaylist = unshuffledPlaylist;
创建一个名为shuffledPlaylist
的新引用,但它也引用unshuffledPlaylist
引用的完全相同的对象。
因此,使用哪个引用来重新排列该列表对象并不重要。
两个引用shuffledPlaylist和unshuffledPlaylist都将引用到完全相同的对象。
以下陈述的含义......
if (shuffledPlaylist == unshuffledPlaylist){
System.out.println("They're equal");
}
是
如果shuffledPlaylist和unshuffledPlaylist引用 相同的对象,打印出“他们是平等的”
输出更准确
System.out.println("shuffledPlaylist and unshuffledPlaylist refer to the exact same object.");