黑马程序员技术交流社区
标题:
复写fill的时候的问题[已解决]
[打印本页]
作者:
王自强
时间:
2012-9-1 00:04
标题:
复写fill的时候的问题[已解决]
本帖最后由 王自强 于 2012-9-2 17:22 编辑
import java.util.*;
class demo
{
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);
tihuan(list,3,5,"b");
sop(list);
}
//实现对List集合中指定元素的替换
public static <T>void tihuan(List<T> list,int start, int end,T obj)
{
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);//?
/*for(int x = start;x<end;x++)
list.set(x,obj);
*/
}
}
复制代码
代码运行时有问题,不知道这种方法错哪了?
fill.jpg
(29.16 KB, 下载次数: 31)
下载附件
2012-9-1 00:04 上传
作者:
郑义
时间:
2012-9-1 08:35
楼主的问题主要在下边这几行代码:
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的字串进行修改,就不会产生并发修改异常
。
作者:
AngieFans85
时间:
2012-9-1 13:35
郑义同学是正解.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2