1 add和set方法的区别
add(Object e)表示在当前list的末尾添加元素。
add(int index, Object element)表示在当前list的index索引增加元素,此索引之后的所有元素依次向后移动一位。
set(int index, Object element)表示替换当前list的index索引元素为element,此索引之后的所有元素索引不变。如下所示:
import java.util.ArrayList; import java.util.List; public class Test { public static void main(String args[]){ List<Object> lst = new ArrayList<Object>(); // lst.add(1,"aa"); lst.add("aa"); lst.add("bb"); System.out.println("lst is :" + lst); lst.set(1, "cc"); System.out.println("lst is :" + lst); lst.add(1, "dd"); System.out.println("lst is :" + lst); } } 运行结果:lst is :[aa, bb]
lst is :[aa, cc] lst is :[aa, dd, cc]2 remove方法
remove(int index)表示删除list中的index索引的值,此索引之后的元素依次向前移动一位,即元素索引依次-1;
import java.util.ArrayList; import java.util.List; public class Test { public static void main(String args[]){ List<Object> lst = new ArrayList<Object>(); // lst.add(1,"aa"); lst.add("aa"); lst.add("bb"); lst.set(1, "cc"); lst.add(1, "dd"); System.out.println("lst is :" + lst); lst.remove(0); System.out.println("lst is :" + lst); } } 运行结果如下:lst is :[aa, dd, cc] lst is :[dd, cc]
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { void init(List<Integer> list) { list.clear(); for (int i = 0; i < 10; i++) { list.add(i + 1); } } void remove(List<Integer> list) { for (int i = 0; i < 5; i++) { list.remove(i); } } void removeTwo(List<Integer> list) { for (int i : list) { if (i < 6) { list.remove(i); } } } void removeThree(List<Integer> list) { for (Iterator<Integer> iter = list.iterator(); iter.hasNext();) { int i = iter.next(); if (i < 6) { iter.remove(); } } } public static void main(String[] args) { Test testList = new Test(); List<Integer> list = new ArrayList<Integer>(); // 第一种方法 testList.init(list); testList.remove(list); System.out.println(list); // 第二种方法 try { testList.init(list); testList.removeTwo(list); System.out.println(list); } catch (Exception e) { e.printStackTrace(); } // 第三种方法 testList.init(list); testList.removeThree(list); System.out.println(list); } } 运行结果:
[2, 4, 6, 8, 10]
java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) at java.util.AbstractList$Itr.next(AbstractList.java:343) at Test.removeTwo(Test.java:45) at Test.main(Test.java:73) [6, 7, 8, 9, 10]
由上例子得知只有第三种方法才是我们想要的方法。
由于remove一个元素后下标发生了变化,因此第一种方法删除了其他的元素。
同时由于元素索引的变化,第二种方法报出了空指针。
第一种方法的改进方法如下:
void remove(List<Integer> list) { int num = list.size() - 5; for (int i = 0; i < num; i++) { list.remove(i); i--; num--; } }