Java ArrayList addAll不是';t添加元素

Java ArrayList addAll不是';t添加元素,java,android,arraylist,Java,Android,Arraylist,我有一个有趣的问题,我想不出来。我有一个简单的ArrayList,它为我的应用程序保存播放列表的顺序。当有人点击另一首歌曲时,需要重新排列播放列表。我在代码的其他地方这样做。然后我调用“setNewPlaylist”,清除播放列表并调用addAll。问题是,传入数组列表中有7个项目,但是在调用addAll后,播放列表大小为0。这完全没有道理,让我有点发疯。我希望有人能帮忙。以下是代码的相关部分。。失败的部分 音乐图书馆 public static final ArrayList<Long&

我有一个有趣的问题,我想不出来。我有一个简单的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());
}
public static final ArrayList playlist=new ArrayList();
//...
公共静态无效setNewPlaylist(ArrayList newPlaylist){
Log.d(“MusicLibrary”,“传入播放列表大小为:”+newPlaylist.size());
playlist.clear();
playlist.addAll(newPlaylist);
Log.d(“MusicLibrary”,“新播放列表大小为:“+playlist.size()”);
}
考虑到这些代码,我在日志中得到了这些

音乐库:传入的播放列表大小为: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

newPlaylist.size() --> newPlaylist==7
playlist.clear(); --> playlist==0
playlist.addAll(newPlaylist); playlist==7
newPlaylist.size() --> newPlaylist==7, playlist==7
playlist.clear(); --> newPlaylist==0, playlist==0
playlist.addAll(newPlaylist); newPlaylist==0, playlist==0
但如果变量引用同一对象,则
播放列表的大小将为
0

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

您将得到第二个结果:
0
。因此,这两个变量
List
引用同一个对象,并且
List.clear()
结果将如此反映这两个变量

事实上,猜测这两个列表指的是同一个对象就足够简单了

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

newPlaylist.size() --> newPlaylist==7
playlist.clear(); --> playlist==0
playlist.addAll(newPlaylist); playlist==7
newPlaylist.size() --> newPlaylist==7, playlist==7
playlist.clear(); --> newPlaylist==0, playlist==0
playlist.addAll(newPlaylist); newPlaylist==0, playlist==0
但如果变量引用同一对象,则
播放列表的大小将为
0

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

您将得到第二个结果:
0
。因此,这两个变量
List
引用同一个对象,并且
List.clear()
结果将如此反映这两个变量

您确定
newPlaylist
playlist
实际上没有引用相同的
ArrayList
?你能显示一下
setNewPlaylist
的调用站点吗?我认为这不是一个,但创建一个会真正帮助解决问题。是否两个变量都指向同一个具体的
ArrayList
?在这种情况下,在
playlist
上调用
clear()
将清除两个变量所引用的(单个)列表,然后后续的
addAll()
调用将只向其自身添加一个空列表。您确定新播放列表没有以任何方式指向播放列表吗?您可以通过在播放列表之后打印新播放列表的大小来测试这一点。clear()您确定
newPlaylist
playlist
实际上没有引用相同的
ArrayList
?你能显示一下
setNewPlaylist
的调用站点吗?我认为这不是一个,但创建一个会真正帮助解决问题。是否两个变量都指向同一个具体的
ArrayList
?在这种情况下,在
playlist
上调用
clear()
将清除两个变量所引用的(单个)列表,然后后续的
addAll()
调用将只向其自身添加一个空列表。您确定新播放列表没有以任何方式指向播放列表吗?您可以通过在playlist.clear()之后打印newPlaylist的大小来测试这一点