我有一个有趣的问题,无法解决。我有一个简单的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()
结果都得到反映。