修改引用对象是否会影响创建新对象的原始对象?
Is modyfying the referenced object affecting the original object from which the new object was created?
我对一件事理解有问题。
我有:
List<Map> resultList = new ArrayList<Map>();
然后这个resultList
填充了一些数据
resultList.addAll(somemethod(something, something, else));
稍后在方法中我有这种代码:
Map timeSpan = someMethod(resultList, date);
timeSpan.put(KEY_ART, VALUE_ART);
timeSpan.put(KEY_TIMESPAN, true);
所以我现在有一个问题。如果 Map timeSpan
是引用 List<Map> resultList
元素的地图,是否在影响 resultList
中的元素的 timeSpan
地图上使用 put()
方法?
我问这个问题是因为一位同事告诉我这是这样工作的——修改 timeSpan
中的一个元素也是修改 resultList
中的这个元素。她经验丰富得多,我不仅想相信她,还想了解为什么会这样。
Java 对象总是被实例化为对内存的引用 space。如果从第一个对象创建第二个对象,两者将指向相同的内存 space:
Map a = new HashMap();
Map B=b = a;
在这里,我们首先创建一个实例A,它指向一个在内存中某处创建的HashMap。接下来,我们创建一个 Map b 的实例,并让它引用与 Map a 相同的内存 space。现在,当我们更改映射 b 时,这些更改也会对映射 a 进行,因为它们指向相同的内存结构。
在你的例子中,你有一个 List 这本身就是一个内存结构。列表中的每个项目都引用一个单独的地图。它们各自也在内存中的某处创建。从列表中检索地图的那一刻,您检索了对实际地图所在的内存 space 的引用。之后,它完全按照示例工作。
您必须记住 resultList
是对对象的 引用。您可以复制此引用并在许多地方以多种方式使用它,但只有一个对象。这意味着当您更改对象时,此对象只有一个视图。
addAll()
会将您作为参数传递给此方法的 Collection/List 中的所有元素复制到当前列表。在您的情况下,由于每个元素都是对 Map
对象的引用,复制后,您有 2 个引用指向同一个 Map
对象,因此使用任何一个引用所做的更改都可以通过另一个引用看到。
简短的回答是,timeSpan 的 put() 会影响 resultList,因为当一个方法 returns 从列表中获取的 Map 时,它 returns 对堆的引用地图元素所在的位置。
我对一件事理解有问题。
我有:
List<Map> resultList = new ArrayList<Map>();
然后这个resultList
填充了一些数据
resultList.addAll(somemethod(something, something, else));
稍后在方法中我有这种代码:
Map timeSpan = someMethod(resultList, date);
timeSpan.put(KEY_ART, VALUE_ART);
timeSpan.put(KEY_TIMESPAN, true);
所以我现在有一个问题。如果 Map timeSpan
是引用 List<Map> resultList
元素的地图,是否在影响 resultList
中的元素的 timeSpan
地图上使用 put()
方法?
我问这个问题是因为一位同事告诉我这是这样工作的——修改 timeSpan
中的一个元素也是修改 resultList
中的这个元素。她经验丰富得多,我不仅想相信她,还想了解为什么会这样。
Java 对象总是被实例化为对内存的引用 space。如果从第一个对象创建第二个对象,两者将指向相同的内存 space:
Map a = new HashMap();
Map B=b = a;
在这里,我们首先创建一个实例A,它指向一个在内存中某处创建的HashMap。接下来,我们创建一个 Map b 的实例,并让它引用与 Map a 相同的内存 space。现在,当我们更改映射 b 时,这些更改也会对映射 a 进行,因为它们指向相同的内存结构。
在你的例子中,你有一个 List 这本身就是一个内存结构。列表中的每个项目都引用一个单独的地图。它们各自也在内存中的某处创建。从列表中检索地图的那一刻,您检索了对实际地图所在的内存 space 的引用。之后,它完全按照示例工作。
您必须记住 resultList
是对对象的 引用。您可以复制此引用并在许多地方以多种方式使用它,但只有一个对象。这意味着当您更改对象时,此对象只有一个视图。
addAll()
会将您作为参数传递给此方法的 Collection/List 中的所有元素复制到当前列表。在您的情况下,由于每个元素都是对 Map
对象的引用,复制后,您有 2 个引用指向同一个 Map
对象,因此使用任何一个引用所做的更改都可以通过另一个引用看到。
简短的回答是,timeSpan 的 put() 会影响 resultList,因为当一个方法 returns 从列表中获取的 Map 时,它 returns 对堆的引用地图元素所在的位置。