如何通过ListIterator在ArrayList子列表的指定元素后添加新元素?
正确实现方案及关键说明
其实你的代码思路已经没问题了,只需要补全add()方法的调用即可,下面是完整的可运行代码,同时我会帮你理清几个容易踩坑的点:
public static void add(List<String> list) { // 获取子列表,对应原列表索引2(包含)到7(不包含)的元素 List<String> subList = list.subList(2, 7); ListIterator<String> listIterator = subList.listIterator(); while (listIterator.hasNext()) { String value = listIterator.next(); if (value.equals("400")) { // 在这里直接调用add方法插入元素399 listIterator.add("399"); } } }
几个核心要点你得知道:
- ListIterator的add()行为:当你用
next()拿到"400"后,迭代器的光标会停在"400"和下一个元素"500"之间,此时调用add("399"),元素会被插入到光标之前的位置——也就是"400"的后面、"500"的前面。最终子列表会变成["200", "300", "400", "399", "500", "600"]。 - subList是原列表的视图:别以为子列表是独立的副本!对子列表的任何修改(包括通过迭代器添加元素)都会直接同步到原ArrayList中。反过来,如果在子列表存在期间,你直接修改原列表(比如调用原列表的
add()/remove()),再操作子列表就会抛出ConcurrentModificationException,这点一定要注意。 - 为什么必须用ListIterator:普通的
Iterator只有remove()方法,没有add()能力,所以这里必须用ListIterator才能实现插入操作。另外,如果你直接用subList.add("399")而不是迭代器的add(),在遍历过程中这么做会触发并发修改异常,因为迭代器会检测到列表被外部修改了。
举个测试的例子,你可以这么验证:
public static void main(String[] args) { List<String> mainList = new ArrayList<>(Arrays.asList("0", "100", "200", "300", "400", "500", "600", "700", "800")); add(mainList); System.out.println(mainList); // 输出结果会是:[0, 100, 200, 300, 400, 399, 500, 600, 700, 800] }
内容的提问来源于stack exchange,提问作者Farhan stands with Palestine
相关产品推荐
相关产品推荐

