我有一个有趣的问题,无法解决。我有一个简单的ArrayList,用于保存我的应用程序的播放列表顺序。当某人单击另一首歌曲时,它需要重新排序播放列表。我正在代码的其他地方这样做。然后,我调用“ setNewPlaylist”以清除播放列表并调用addAll。问题是,传入的数组列表中有7个项目,但是在调用addAll之后,播放列表的大小为0。这完全没有意义,这让我有点发疯。我希望有人能提供帮助。这是代码的相关部分..失败的部分...

曲库...

public static final ArrayList<Long> playlist = new ArrayList<>();
//...

public static void setNewPlaylist(ArrayList<Long> newPlaylist) {
    Log.d("MusicLibrary", "Incoming playlist size is: " + newPlaylist.size());
    playlist.clear();
    playlist.addAll(newPlaylist);
    Log.d("MusicLibrary", "New playlist size is: " + playlist.size());
}


给定该代码,我将在日志中获取它。


  D / MusicLibrary:传入播放列表的大小为:7
                  新的播放列表大小为:0


这怎么可能呢?传入列表中有7个项目,我清除了静态播放列表,然后调用addAll,它的长度为0?请在这里帮助我,这没有任何意义,我完全不知所措。谢谢。

我错了。我以为我正在为newPlaylist创建一个新的数组列表,但事实证明我在使用...

ArrayList newPlaylist = MusicLibrary.getPlaylist();

它将仅从MusicLibrary中编辑播放列表,而不创建新的数组列表。从PHP来看,newPlaylist不是MusicLibrary中的原始播放列表,并且对其进行编辑不会更改对MusicLibrary中实际播放列表的引用。我道歉。谢谢。

最佳答案

实际上,猜测两个列表引用相同的对象就足够简单了。

1. Log.d("MusicLibrary", "Incoming playlist size is: " + newPlaylist.size()); // 7
2. playlist.clear();
3. playlist.addAll(newPlaylist);
4. Log.d("MusicLibrary", "New playlist size is: " + playlist.size()); // 0


在第1行:newPlaylist.size==7,然后永远不要在newPlaylist变量上调用任何可能更改所引用对象大小的方法。
因此,如果第4行的playlist.size()不是7而是0,则有必要删除newPlaylist元素。在此代码中,清除列表的唯一内容是:playlist.clear()



您可以通过模拟两种情况(相同的对象或两个不同的对象)进行检查。

如果变量引用了两个不同的对象,则7的大小将为playlist

newPlaylist.size() --> newPlaylist==7
playlist.clear(); --> playlist==0
playlist.addAll(newPlaylist); playlist==7


但是,如果变量引用相同的对象,则0的大小将为playlist

newPlaylist.size() --> newPlaylist==7, playlist==7
playlist.clear(); --> newPlaylist==0, playlist==0
playlist.addAll(newPlaylist); newPlaylist==0, playlist==0


您得到第二个结果:0。因此,两个变量List引用相同的对象,因此两个变量的List.clear()结果都得到反映。

08-05 18:15