黑马程序员技术交流社区
标题:
集合的数据共享问题?
[打印本页]
作者:
李阳
时间:
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
真相是这样:
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); //List接口的subList方法是一个截取的方法,就像字符串截取一样
System.out.println(a2); //但值得注意的是,这个方法返回的这个子列表的幕后其实还是原列表;也就是说,修改操作这个子列表将导致原列表也
a2. clear(); //发生改变,反之亦然。所以使用subList这个方法时要注意这些。
System.out.println(a1);
}
}
对于下面的:
ArrayList<String> a1 = new ArrayList<String>();
a1.add("abc1");
ArrayList<String> a3 = new ArrayList<String>();
a3.add("abc1");
a3.clear(); //在这里我想说,clear()只是清除了对象的引用,"abc1"还存在。
System.out.println(a1);
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2