循环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, 所以可以直接使用了

发布了74 篇原创文章 · 获赞 49 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_34208844/article/details/95600619