在添加或者删除ArrayList集合中的元素时,不能使用foreach来增删元素,若需要增删元素可以使用迭代器或者普通for循环。只是修改元素内容的话,哪种都可以。
// 使用迭代器
List<String> list = new ArrayList<>();
Iterator<String> it = list.iterator();
while(it.hasNext()) {
if(it.next().equals("Lemon")) {
it.remove();
}
}
// 使用普通for循环
List<String> list = new ArrayList<>();
for(int i = 0; i < list.size(); i++) {
if(list.get(i).equals("Lemon")) {
list.add("Watermelon");
}
}
问题原因:java的foreach循环其实就是根据list对象创建一个Iterator迭代对象,用这个迭代对象来遍历list,相当于list对象中元素的遍历托管给了Iterator,你如果要对list进行增删操作,都必须经过Iterator。iterator创建的时候modCount被赋值给了expectedModCount,但是调用list的add和remove方法的时候不会同时自动增减expectedModCount,这样就导致两个count不相等,从而抛出异常。
List、Set、Map都有的of方法,可以创建一个不可变的集合,创建不可变集合时需要在初始化时指明元素。JDK9及以上才有此方法,JDK8需引入外部类guava。
也可使用Collections工具类中的unmodifiable方法将集合类包含进去,返回的就是不可修改的集合对象,但对于原集合对象的修改依旧会反映到不可修改的集合对象中,相当于只是对原集合对象进行了一次包装。
List<String> list = List.of("123", "456");
Set<String> set = Set.of("abc", "def");
Map<String,String> map = Map.of("sd", "sdf", "ds", "12"); // 可以用foreach来进行遍历
特点:
常规操作
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
使用匿名内部类
List<Integer> list2 = new ArrayList() {{
add(1);
add(2);
add(3);
}};
使用流式操作
List<Integer> list3 = Stream.of(1, 2, 3).collect(toList());