当前位置: 首页 > 面试题库 >

为什么子列表中的更改会反映在原始列表中?

应嘉容
2023-03-14
问题内容

我知道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);

问题答案:

根据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



 类似资料:
  • 问题内容: 我需要在Python中创建列表列表,因此输入了以下内容: 该列表如下所示: 然后,我更改了最内在的值之一: 现在我的列表如下所示: 这不是我想要或期望的。有人可以解释发生了什么,以及如何解决吗? 问题答案: 当您编写时,您基本上得到了。也就是说,具有3个对same的引用的列表。然后,当您修改此单曲时x,可以通过对其的所有三个引用来看到它: 要修复它,您需要确保在每个位置创建一个新列表。

  • 为什么这里两个列表的大小都是零?按照我的理解,< code>aList1.size()应该是< code>0,而< code>aList2.size()应该是< code>1。

  • 问题内容: 当我编写这段代码时: 我认为它将输出以下内容: 但是,事实并非如此。我如何得到它来输出? 问题答案: Python变量包含对 值的 引用。因此,在定义列表时,您传入所引用的值,而不是变量本身。 您应该将值想象为气球,变量是绑定到那些气球的线程。是一个气球,只是该气球的一个线程,并且列表具有与该气球相关的 不同 线程。在python中,列表只是一系列线程,所有线程均从0开始编号。 接下来

  • 问题内容: 在应使用相同的列表时,我看到一些不一致之处。(Python 2.7.5) 有人有一个简单的解释吗? 问题答案: 使用列表文字,VM会创建具有设置长度的列表。当将序列传递给构造函数时,元素将被一个接一个地添加(通过),因此在适当时调整了列表的大小。由于调整大小操作是为了分摊成本而进行的,因此最终列表通常会比源列表大。

  • 问题内容: 新手有问题,请保持温柔: 结果是: 我不明白为什么列表改变时,我只是在做,没有。我什至不知道要用什么搜索词来弄清楚。 问题答案: 这是因为在进行分配后,和都引用相同的列表。 尝试执行以下操作以查看它们是指相同的对象还是不同的对象: 一个例子: 如果您确实要创建这样的重复副本,而不是引用原始列表,而是引用列表的副本,请使用slice运算符: 一个例子: 另外,请勿将其用作变量名,因为最初

  • 我想把一个数组的不同数组元素组合(排列)放到一个列表中。我通过for循环交换数组的第一个和最后一个元素,组合(排列)被添加到列表中。然后,第二个元素和最后一个元素之前的元素被交换并添加到列表中,依此类推。假设数组是,添加到列表中的第一个元素将是。第二个元素是。但我最终得到的是列表中所有元素的。 问题是添加到List中的元素也会随着数组的当前修改而相应地修改。我最终在List中得到了类似的数组元素。