- 有没有比我在 add 方法中编码的更好的方法将列表添加到另一个现有列表?
从播放列表中删除歌曲列表的方法是否正确,还是我会遇到并发修改异常?
class Playlist { List<Song> playList; public void addSongs(List<Song> songs) { for(Song s:songs) playList.add(s); } public void removeSongs(List<Song> songs) { for(Song s:songs) if(playList.contains(s)) playList.remove(s); } }
问问题
118 次
4 回答
2
要将一个列表中的所有元素添加到另一个列表中,请使用;
将指定集合中的所有元素附加到此列表的末尾,按照指定集合的迭代器返回的顺序
从另一个用途中删除一个列表中的所有元素;
从此列表中删除指定集合中包含的所有元素
于 2012-10-11T01:48:42.843 回答
2
参考您的版本removeSongs
但是想知道,因为这是在迭代列表时对列表的修改,它是否会导致并发修改异常
假设列表是标准列表类的实例,您的代码不应抛出 CME。
如果您在迭代集合时修改集合(除了您使用Iterator.remove()
...时),通常会抛出 CME。您的代码正在迭代songs
和修改playlist
. 这不会导致显示的代码中出现 CME。
但是,如果其他代码playlist
与此代码同时迭代,则其他代码可能会在下次使用其迭代器时获得 CME。同样,如果在您的代码迭代时修改了其他代码songs
,则此代码可能会引发 CME。(您需要查看其余代码以确定是否可能出现这些情况。)
于 2012-10-11T02:07:16.257 回答
1
使用addAll()
和 removeAll()
方法:
playList.addAll(songs);
playList.removeAll(songs);
于 2012-10-11T01:48:14.543 回答
0
实例化你的List
class Playlist
{
List<Song> playList;
public Playlist(){
playList = new ArrayList<Song>();
}
这里不需要循环。改为使用addAll
。
public void addSongs(List<Song> songs)
{
playList.addAll(songs);
}
您在这里也不需要循环。改为使用removeAll
。
public void removeSongs(List<Song> songs)
{
playList.removeAll(songs);
}
}
于 2012-10-11T01:50:55.900 回答