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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

本帖最后由 李阳 于 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个集合没有共享。
为什么会这样呢?

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

2 个回复

倒序浏览
引用类型是他们存储的都只是对象的地址罢了.
你的第一个示例,代表的是把a1的地址,中的俩个元素也传给了a2;也就是a1/a2一起指示内存中的那几个元素.类似a2-->a1--0x00234;
第二个示例:是a1,a2单独指向,a1--->0x00234  a2--->0x00234,a2不指了,并不影响a1的元素.
以上两个示例中,所有的String对象,不管ArrayList怎么操作,他们还是存在着.
你想的是String对象"abc1"在内存中销毁么?那不是ArrayLIst能干的活...不是有垃圾回收器么...


评分

参与人数 1黑马币 +10 收起 理由
洪建超 + 10

查看全部评分

回复 使用道具 举报
真相是这样:
  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);
复制代码

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马