楼主的问题主要在下边这几行代码:- List<T> sublist1 = list.subList(0,start);
- List<T> sublist2 = list.subList(start,end);
- List<T> sublist3 = list.subList(end,list.size());
- Collections.fill(sublist2,obj);
- list.clear();
- list.addAll(sublist1);//? 错哪了?
- list.addAll(sublist2);//?
- list.addAll(sublist3);//?
复制代码 首先可以知道这个异常是并发修改异常。其问题就在于代码前后的联系。
比如,你已经执行了
List<T> sublist1 = list.subList(0,start);
List<T> sublist2 = list.subList(start,end);
List<T> sublist3 = list.subList(end,list.size());
Collections.fill(sublist2,obj);
这几句,但是当你执行完了list.clear();这句后,list本身已经清空。
但是sublist1,sublist2和sublist3都是list的子集合。所以当list改变之后实际上子集合也应该改变。
但是这样Java虚拟机就不知道你所需要的子集合是什么了,所以就会报出并发修改异常。
即使把list.clear();去掉,
list.addAll(sublist1);
list.addAll(sublist2);
list.addAll(sublist3);
这三句也在修改list集合,所以也会报出并发修改异常。
所以只要重新定义一个新的list集合,这个程序就可以正常运行了。
代码:- import java.util.*;
- class Test1
- {
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void main(String[] args)
- {
- List<String> list = new ArrayList<String>();
- list.add("a");list.add("a");list.add("a");
- list.add("a");list.add("a");list.add("a");
- sop(list);
- list = tihuan(list,3,5,"b");
- sop(list);
- }
- //实现对List集合中指定元素的替换
- public static<T> List<T> tihuan(List<T> list,int start, int end,T obj)
- {
- List<T> newlist = new ArrayList<T>();
- List<T> sublist1 = list.subList(0,start);
- List<T> sublist2 = list.subList(start,end);
- List<T> sublist3 = list.subList(end,list.size());
- Collections.fill(sublist2,obj);
- newlist.addAll(sublist1);
- newlist.addAll(sublist2);
- newlist.addAll(sublist3);
- return newlist;
- }
- }
复制代码 这样,建立新的list之后就不会对list和list的字串进行修改,就不会产生并发修改异常。
|