Shu*_*rde 5 java list arraylist sublist
我知道,Collections当你通过引用传递它们时,Java是可变的.
我想知道究竟在原始列表和子列表的内存地址中发生了什么.
子列表和原始列表是否指向同一个对象?
以下是反映子列表中对主要原始列表所做更改的代码示例.
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add(1, "3");
List<String> list2 = new LinkedList<String>(list);
list.addAll(list2);
list2 = list.subList(2, 5);
list2.clear(); //Changes are made to list
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)
根据JavaDoc事情:
列出subList(int fromIndex,int toIndex)
返回指定fromIndex(包含)和toIndex(独占)之间此列表部分的视图.(如果fromIndex和toIndex相等,则返回的列表为空.)返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然.返回的列表支持此列表支持的所有可选列表操作.
子列表将指向原始列表中存在的相同元素,因此,由于您要更改相同的对象,因此通过子列表所做的任何更改都将反映在原始列表中.
编辑:根据您的评论,假设它original list具有以下引用:0x00 0x01 0x02 0x03 0x04 0x05并且这些映射到存储器中存在对象的位置.
做sublist(0, 2)上述将产生其中包含指向下面存储器位置的列表0x00 0x01 0x02,其是相同original list.
这意味着,如果你这样做sublist.get(0).setFoo(foo),这将反过来寻找出现的对象0x00并设置一些属性.但是,0x00也被引用original list,这就是为什么更改子列表意味着您将更改源列表,因为两个列表都指向相同的对象.如果您改变元素,也同样如此original list.
| 归档时间: |
|
| 查看次数: |
2501 次 |
| 最近记录: |