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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马伍仪华 中级黑马   /  2012-3-6 20:20  /  1719 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



List<Object> lists = new ArrayList<Object>();

        lists.add("1");
        lists.add("2");
        lists.add("3");
        lists.add("4");

        List<Object> tempList = lists.subList(2, lists.size());

        tempList.add("6");

        System.out.println(tempList); // 1

        System.out.println(lists); // 2


代码初步写好后,可能我们想达到的效果是:往集合lists的子集合tempList中添加一个元素6,而原有的集合保持不变。

即到达这样的效果:lists = [1, 2, 3, 4],tempList = [3, 4, 6]。但是我们看到实际的结果确是lists里边也添加了元素6。
这是怎么一会事呢

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 马胜平 于 2012-3-6 20:40 编辑

subLiist并没有改变原来的列表,看文档说明:返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图
返回的列表由此列表支持,因此返回列表中的非结构性更改将反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。
必须再加条语句  tempList=new ArrayList(temptList)
当我们使用子集合tempList进行元素的修改操作时,会影响原有的list集合。所以在使用subList方法时,一定要想清楚,是否需要对子集合进行修改元素而不影响原有的list集合。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
API中明确有subList()返回的列表由此列表支持,因此返回列表中的非结构性更改将反映在此列表中; 如果想要那个效果不要用这个序列化的LIST<E>这个接口类 直接用List就好了

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
List<E> subList(int fromIndex,
                int toIndex)返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。(如果 fromIndex 和 toIndex 相等,则返回的列表为空)。返回的列表由此列表支持,因此返回列表中的非结构性更改将反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。
此方法省去了显式范围操作(此操作通常针对数组存在)。通过传递 subList 视图而非整个列表,期望列表的任何操作可用作范围操作。例如,下面的语句从列表中移除了元素的范围:

            list.subList(from, to).clear();
看不懂给我留言!

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
马胜平 发表于 2012-3-6 20:36
subLiist并没有改变原来的列表,看文档说明:返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之 ...

加条语句 tempList=new ArrayList(temptList) 不行呀,而tempList = new ArrayList() 只是清空 list.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马