1

假设我有一个名为 L 的链表,它存储链表,所以:

LinkedList <LinkedList<String>> L

如果我这样做了L1 = L.getLast(),我也可以说L.getLast.add("something")或者L1.add("something")并且会在最后一个列表中添加“某物”还是仅在该列表的本地实例中添加“某物”?

4

3 回答 3

1

这会将“某物”添加到最后一个列表还是仅添加该列表的本地实例?

由于您要添加到由两个引用(而不是实例)指向的同一个列表中,因此两行代码都将工作相同。

给定

LinkedList <LinkedList<String>> L

以下两个片段将完全相同

  • 有一个指向最后一个节点的本地引用(它不是你写的实例)。

    L1 = L.getLast() 
    
    L1.add("something") 
    
  • 没有本地引用但使用存储在外部的引用LinkedList L

    L.getLast.add("something") 
    
于 2012-10-31T07:04:51.193 回答
0

“该列表的本地实例”是什么意思?我们在这里处理引用类型——存储在外部列表中的只是对列表实例的引用。当您获取最后一个元素时,只会为您获取参考的副本。无论您如何访问该对象,您仍在修改该单个对象。

您通过创建 a 使您的示例变得比它需要的更复杂LinkedList<LinkedList<String>>,但从根本上讲,这与我们可以用 a 轻松演示的问题相同StringBuilder

StringBuilder x = new StringBuilder();
StringBuilder y = x; // Copies the *reference*, not an object
y.append("foo");
System.out.println(x); // Prints "foo"

同样,我们有一个StringBuilder对象,两者的值xy都是对同一对象的引用。无论您如何修改它,修改都是可见的,但是您随后访问该对象。

或者,如果您想以列表为例:

List<String> list1 = new ArrayList<String>();
List<String> list2 = list1;
list1.add("help");
System.out.println(list2.size()); // Prints 1

这对于理解 Java 至关重要——所有类都以相同的方式工作。表达式的值永远不是对象;它始终是引用或原始值。

于 2012-10-31T07:00:47.033 回答
0

L1 和 l.getLast() 都引用同一个对象(父链表中的最后一个)。

您可以使用 L1.addLast("something") 或 l.getlast().addlast("something") 将“something”添加到最后一个列表中。

于 2012-10-31T07:03:17.190 回答