黑马程序员技术交流社区
标题:
Collections.fill()方法练习题的疑惑?
[打印本页]
作者:
李阳
时间:
2013-3-4 15:14
标题:
Collections.fill()方法练习题的疑惑?
本帖最后由 李阳 于 2013-3-4 19:35 编辑
/*
使用fill方法把“QQ”替换List集合一段元素
*/
import java.util.*;
class CollectionsDemo2
{
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("abhjc");
list.add("kdkd");
list.add("egklc");
list.add("erc");
System.out.println(list);
List<String> al = list.subList(1,3);//获取角标1到3的元素,不包括3
//list.removeAll(al);//从原集合移除获取的元素,执行这句话就会报异常。
System.out.println(list);
Collections.fill(al,"QQ");//替换
System.out.println(al);
//list.addAll(1,al);//将替换后的集合插入list集合,执行这句话会多出个"QQ",
System.out.println(list);
}
}
上面的2个情况是怎么导致的?
作者:
杨杨
时间:
2013-3-4 16:45
本帖最后由 杨杨 于 2013-3-4 17:03 编辑
1. 改 al.removeAll(list);//从原集合移除获取的元素,执行这句话就会报异常。
2 List<String> al = list.subList(1,3)获取角标1到3的元素,不包括3
// System.out.println(al);
//al.removeAll(list);//从原集合移除获取的元素,执行这句话就会报异常。
//System.out.println(list);
Collections.fill(al,"QQ");//替换
System.out.println(al);
list.addAll(1,al);//将替换后的集合插入list集合,执行这句话会多出个"QQ",
本来一个数组你弄成啦二维数组
作者:
lzw123451
时间:
2013-3-4 16:52
import java.util.*;
/*class CollectionsDemo2
{
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("abhjc");
list.add("kdkd");
list.add("egklc");
list.add("erc");
System.out.println(list);
//List<String> al = list.subList(1,3);//把这里注释了
List<String> al = new ArrayList<String>();
al.add("kdkd");
al.add("egklc");
list.removeAll(al);//从原集合移除获取的元素,执行这句话就会报异常。
System.out.println(list);
System.out.println(al); // OK
// Collections.fill(al,"QQ");
// System.out.println(al);
// list.addAll(1,al);
// System.out.println(list);
}
}*/
class CollectionsDemo2
{
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("abhjc");
list.add("kdkd");
list.add("egklc");
list.add("erc");
System.out.println(list);
List<String> al = list.subList(1,3);
list.remove(0);
System.out.println(list);
System.out.println(al); // 开始报异常
Collections.fill(al,"QQ");
System.out.println(al);
list.addAll(1,al);
System.out.println(list);
}
}
复制代码
通过上面的两个修改,发现如果al是自定义的一个集合,它是可以操作的。但如果al是从集合list中subList出来的,那么在后面的操作中,只要对list做了修改,再调用al时就会报异常。从这个结果看出,list.subList()出来的al竟然是与list的数据共享的,而不是另外创建了一个集合,集合里面再从list复制两个元素。所以后面的当你对元集合list进行了修改时,由于list的元素内容和长度都发生了变化,list.subList()方法根据索引返回的集合就不确定了,后面再对al调用就不安全(因为改变了listj就会改变al).
总之,在用al=list.subList()方法后,对list进行操作后就不能对list.subList()的返回值al进行操作,否则会不安全,系统会报异常。
作者:
lzw123451
时间:
2013-3-4 17:26
还有//list.addAll(1,al);//将替换后的集合插入list集合,执行这句话会多出个"QQ",
我运行了,并没有多个qq。
import java.util.*;
class CollectionsDemo2
{
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("abhjc");
list.add("kdkd");
list.add("egklc");
list.add("erc");
System.out.println(list);
List<String> al = list.subList(1,3);
System.out.println(list);
System.out.println(al);
Collections.fill(al,"QQ");
System.out.println(al);
System.out.println(list);
list.addAll(1,al);
System.out.println(list);
}
}
复制代码
从运行结果再次看出,al和list是共享数据的,当你把al的数据改为“QQ”,llist里面的两个元素也改为“QQ”了,然后你再插入了两个元素“QQ”,总共4个。
当然,这时候list已经更改了,后面al就不能再用了。
作者:
李阳
时间:
2013-3-4 19:35
谢谢你啦,很详细。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2