循环list移除元素-java.lang.UnsupportedOperationException
场景:
在一个codeList
列表中移除指定的元素
常规for循环(根据list下标删除)
用for循环, 根据循环cursor
来移除在List
指定位置的元素
private boolean removeList(List<String> codeList, String code) {
for (int i = 0; i < codeList.size(); i++) {
String codeFromList = codeList.get(i);
if (StringUtils.equalsAnyIgnoreCase(codeFromList, code)) {
codeList.remove(i);
return true;
}
}
return false;
}
foreach循环(根据元素对象删除)
在foreach循环中, 根据当前对象来删除, 如果有多个则删除第一个(
remove(object)
的实现最终也是通过传入的object
取得第一个匹配元素的下标, 所以理论上remove
行为直接根据下标删除元素性能更好
private boolean removeList(List<String> codeList, String code) {
for (String codeFromList : codeList) {
if (StringUtils.equalsAnyIgnoreCase(codeFromList, code)) {
boolean remove = codeList.remove(code);
return remove;
}
}
return false;
}
迭代器循环删除元素
利用迭代器的能力来删除指定的元素(注意: 不要在另外的线程修改原List
)
private boolean removeList(List<String> codeList, String code) {
Iterator<String> iterator = codeList.iterator();
if (iterator.hasNext()) {
String next = iterator.next();
if (StringUtils.equalsAnyIgnoreCase(next, code)) {
iterator.remove();
return true;
}
}
return false;
}
异常分析与解决
异常定位
我使用发现前面3个方法都报java.lang.UnsupportedOperationException
异常…
原来我的List
是使用Arrays.asList()
方法构造出来的…
Arrays.asList()
返回的List
是个普通的List
没有实现remove
方法…
解决方案
将List
转成ArrayList
即可
List<String> codeList = new ArrayList<>(Arrays.asList(questionPartEnum.codeList))
ArrayList
中实现了remove
, 所以可以直接使用了