黑马程序员技术交流社区

标题: 集合的数据共享问题? [打印本页]

作者: 李阳    时间: 2013-3-5 15:54
标题: 集合的数据共享问题?
本帖最后由 李阳 于 2013-3-5 20:57 编辑

class SystemDemo
{
        public static void main(String[] args)
        {
               ArrayList<String> a1 = new ArrayList<String>();
                a1.add("abc1");
                a1.add("abc2");
                a1.add("abc3");
                a1.add("abc4");
                List<String> a2 = a1.subList(1,3);
                System.out.println(a2);
                a2.clear();
                System.out.println(a1);
        }
}
对a2清空后导致a1里相同元素也被删除,这说明两个集合共享了数据。因为数据是String类型的。
ArrayList<String> a1 = new ArrayList<String>();
  a1.add("abc1");
  ArrayList<String> a3 = new ArrayList<String>();
  a3.add("abc1");
  a3.clear();
  System.out.println(a1);
执行这块代码发现2个集合没有共享。
为什么会这样呢?
作者: 陈圳    时间: 2013-3-5 16:28
引用类型是他们存储的都只是对象的地址罢了.
你的第一个示例,代表的是把a1的地址,中的俩个元素也传给了a2;也就是a1/a2一起指示内存中的那几个元素.类似a2-->a1--0x00234;
第二个示例:是a1,a2单独指向,a1--->0x00234  a2--->0x00234,a2不指了,并不影响a1的元素.
以上两个示例中,所有的String对象,不管ArrayList怎么操作,他们还是存在着.
你想的是String对象"abc1"在内存中销毁么?那不是ArrayLIst能干的活...不是有垃圾回收器么...



作者: 克零岚    时间: 2013-3-5 17:55
真相是这样:
  1. class SystemDemo
  2. {
  3. public static void main(String[] args)
  4. {
  5. ArrayList<String> a1 = new ArrayList<String>();      
  6. a1.add("abc1");
  7. a1.add("abc2");
  8. a1.add("abc3");
  9. a1.add("abc4");
  10. List<String> a2 = a1.subList(1,3);                      //List接口的subList方法是一个截取的方法,就像字符串截取一样
  11. System.out.println(a2);                                      //但值得注意的是,这个方法返回的这个子列表的幕后其实还是原列表;也就是说,修改操作这个子列表将导致原列表也
  12. a2. clear();                                                         //发生改变,反之亦然。所以使用subList这个方法时要注意这些。                                
  13. System.out.println(a1);
  14.          }
  15. }

  16. 对于下面的:
  17. ArrayList<String> a1 = new ArrayList<String>();
  18.   a1.add("abc1");
  19.   ArrayList<String> a3 = new ArrayList<String>();
  20.   a3.add("abc1");
  21.   a3.clear();                                             //在这里我想说,clear()只是清除了对象的引用,"abc1"还存在。
  22.   System.out.println(a1);
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2