ArrayList增删元素出现的问题:

在添加或者删除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集合的方法(可变列表)

  1. 常规操作

    List<Integer> list=new ArrayList<>();
    	list.add(1);
    	list.add(2);
    	list.add(3);
    
  2. 使用匿名内部类

    List<Integer> list2 = new ArrayList() {{
    	add(1);
    	add(2);
    	add(3);
    }};
    
  3. 使用流式操作

    List<Integer> list3 = Stream.of(1, 2, 3).collect(toList());
    

将数组转换为List集合的方法