黑马程序员技术交流社区
标题:
关于subList方法。
[打印本页]
作者:
寐海流风
时间:
2014-6-11 22:10
标题:
关于subList方法。
本帖最后由 寐海流风 于 2014-6-14 10:33 编辑
自己敲代码的时候遇到个关于subList的问题,简化写在下面(真心等待高手解答):
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
List<String> list2 = list.subList(0,2);
list2.set(0,"abc0");
System.out.println(list);
System.out.println(list2);
为什么打印结果是:
[abc0, abc2, abc3, abc4]
[abc0, abc2]
_______________________________
list2.set(0,"abc0");只是修改了list2[0],为什么list[0]也被修改了?
作者:
寐海流风
时间:
2014-6-12 11:14
顶啊,别沉。
作者:
yanghu
时间:
2014-6-12 11:32
这只能说明一个问题,subList()方法,它底层是存储着字符串对象的引用地址,并没有复制一个对象。所以才会导致这个现象。
作者:
铁血丹心
时间:
2014-6-12 12:48
新手也可以回答你这个问题,根据问题的现象先去查API,发现有这么一句话:
subList
List
<
E
>
subList
(int fromIndex, int toIndex)
返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。(如果 fromIndex 和 toIndex 相等,则返回的列表为空)。
返回的列表由此列表支持,因此返回列表中的非结构性更改将反映在此列表中
,反之亦然。返回的列表支持此列表支持的所有可选列表操作。
红色字体这句话就是告诉你改动了list2中的元素,list元素也会随之改动,API又举了下面的列子,运行下面这个命令,就可以将list集合清空,我试了可以,你自己试一下吧
此方法省去了显式范围操作(此操作通常针对数组存在)。通过传递 subList 视图而非整个列表,期望列表的任何操作可用作范围操作。例如,下面的语句从列表中移除了元素的范围:
list.subList(from, to).clear();
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2