ArrayList addAll没有添加元素

时间:2018-08-08 19:20:18

标签: java android arraylist

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

MusicLibrary ...

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 个答案:

答案 0 :(得分:4)

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

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()反映出来。