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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 寐海流风 中级黑马   /  2014-6-11 22:10  /  1618 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 寐海流风 于 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]也被修改了?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

4 个回复

倒序浏览
顶啊,别沉。
回复 使用道具 举报
这只能说明一个问题,subList()方法,它底层是存储着字符串对象的引用地址,并没有复制一个对象。所以才会导致这个现象。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
新手也可以回答你这个问题,根据问题的现象先去查API,发现有这么一句话:subListList<E> subList(int fromIndex,                int toIndex)返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。(如果 fromIndex 和 toIndex 相等,则返回的列表为空)。返回的列表由此列表支持,因此返回列表中的非结构性更改将反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。红色字体这句话就是告诉你改动了list2中的元素,list元素也会随之改动,API又举了下面的列子,运行下面这个命令,就可以将list集合清空,我试了可以,你自己试一下吧此方法省去了显式范围操作(此操作通常针对数组存在)。通过传递 subList 视图而非整个列表,期望列表的任何操作可用作范围操作。例如,下面的语句从列表中移除了元素的范围:
            list.subList(from, to).clear();

点评

怎么我发出来的格式这么丑啊,不好意思  发表于 2014-6-12 12:52

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

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