我有一个简单的问题。
假设我们有Map
,例如Map<String, Object>
我想要一个方法,它返回Map
内所有值的列表。
我使用的方法如下:
List<Object> myList = new ArrayList<>();
iterator
。Map
iterator i
内的每个元素都在myList
列表中添加了引用。synchronized
块中,因为该列表包含引用。现在我担心使用更简单的apporach。我的意思是:
return new ArrayList(myMap.values());
正如您在本案中所看到的,我只使用接受集合的List
接口的构造函数。
最后我的问题是:
如果我使用第二种方法,我仍然可以获得引用,还是复制地图内的值对象?
答案 0 :(得分:3)
在这两种情况下,你都会得到浅#34; collecion的副本,因此两个数组都将保留对相同对象的引用。
答案 1 :(得分:2)
return new ArrayList(myMap.values())
将返回一个ArrayList,其中包含Map原始值的引用。没有创建值实例的副本。
请注意,如果您的Map包含重复值(即彼此相等的值),则ArrayList也将包含重复值。如果要消除重复项,则应创建一组值而不是列表。
答案 2 :(得分:2)
在任何一种情况下,你都会得到一份参考文献(所谓的“浅版”)。
没有深度复制(创建一个包含有意义的等效字段的全新对象 - 也是深度复制的)。