A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李阳 中级黑马   /  2013-3-4 15:14  /  2096 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李阳 于 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个情况是怎么导致的?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 杨杨 于 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",
本来一个数组你弄成啦二维数组

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
  1. import java.util.*;
  2. /*class CollectionsDemo2
  3. {
  4. public static void main(String[] args)
  5. {
  6. List<String> list = new ArrayList<String>();
  7. list.add("abhjc");
  8. list.add("kdkd");
  9. list.add("egklc");
  10. list.add("erc");
  11. System.out.println(list);
  12. //List<String> al = list.subList(1,3);//把这里注释了
  13. List<String> al = new ArrayList<String>();
  14. al.add("kdkd");
  15. al.add("egklc");
  16. list.removeAll(al);//从原集合移除获取的元素,执行这句话就会报异常。
  17. System.out.println(list);
  18. System.out.println(al); // OK
  19. // Collections.fill(al,"QQ");
  20. // System.out.println(al);
  21. // list.addAll(1,al);
  22. // System.out.println(list);
  23. }
  24. }*/


  25. class CollectionsDemo2
  26. {
  27. public static void main(String[] args)
  28. {
  29. List<String> list = new ArrayList<String>();
  30. list.add("abhjc");
  31. list.add("kdkd");
  32. list.add("egklc");
  33. list.add("erc");
  34. System.out.println(list);
  35. List<String> al = list.subList(1,3);

  36. list.remove(0);
  37. System.out.println(list);
  38. System.out.println(al); // 开始报异常
  39. Collections.fill(al,"QQ");
  40. System.out.println(al);
  41. list.addAll(1,al);
  42. System.out.println(list);
  43. }
  44. }
复制代码
通过上面的两个修改,发现如果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进行操作,否则会不安全,系统会报异常。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
还有//list.addAll(1,al);//将替换后的集合插入list集合,执行这句话会多出个"QQ",
我运行了,并没有多个qq。
  1. import java.util.*;
  2. class CollectionsDemo2
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 List<String> list = new ArrayList<String>();
  7.                 list.add("abhjc");
  8.                 list.add("kdkd");
  9.                 list.add("egklc");
  10.                 list.add("erc");
  11.                 System.out.println(list);
  12.                 List<String> al = list.subList(1,3);
  13.                
  14.                
  15.                 System.out.println(list);
  16.                 System.out.println(al);      
  17.                 Collections.fill(al,"QQ");
  18.                System.out.println(al);
  19.                   System.out.println(list);
  20.                list.addAll(1,al);
  21.                 System.out.println(list);        
  22.         }
  23. }
复制代码
从运行结果再次看出,al和list是共享数据的,当你把al的数据改为“QQ”,llist里面的两个元素也改为“QQ”了,然后你再插入了两个元素“QQ”,总共4个。
当然,这时候list已经更改了,后面al就不能再用了。
回复 使用道具 举报
谢谢你啦,很详细。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马