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

List lists = new ArrayList();

    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。
这是怎么一会事呢

[code="java"]
class SubList extends AbstractList {
private AbstractList l;
private int offset;
private int size;
private int expectedModCount;

SubList(AbstractList<E> list, int fromIndex, int toIndex) {
    if (fromIndex < 0)
        throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
    if (toIndex > list.size())
        throw new IndexOutOfBoundsException("toIndex = " + toIndex);
    if (fromIndex > toIndex)
        throw new IllegalArgumentException("fromIndex(" + fromIndex +
                                           ") > toIndex(" + toIndex + ")");
    l = list;
    offset = fromIndex;
    size = toIndex - fromIndex;
    expectedModCount = l.modCount;
}

[/code]
这个是jdk的源代码,我把sublist贴出来
这里可以明显的看到 l=list
说明引用的对象还是同一个,只是其他的量变了

楼上说的有道理 这样改进:
[code="java"]
List tempList = lists.subList(2, lists.size()).clone();
[/code]