ArrayList构造函数接受Collection

时间:2015-07-04 10:57:03

标签: java list collections

我有一个简单的问题。

假设我们有Map,例如Map<String, Object>

我想要一个方法,它返回Map内所有值的列表。

我使用的方法如下:

  1. 我创建了一个List<Object> myList = new ArrayList<>();
  2. iterator
  3. 的值集中获取Map
  4. iterator i内的每个元素都在myList列表中添加了引用。
  5. 返回列表
  6. ...稍后对于我使用的每个元素,我将其包装在synchronized块中,因为该列表包含引用。
  7. 现在我担心使用更简单的apporach。我的意思是:

    return new ArrayList(myMap.values());
    

    正如您在本案中所看到的,我只使用接受集合的List接口的构造函数。

    最后我的问题是:

    如果我使用第二种方法,我仍然可以获得引用,还是复制地图内的值对象?

3 个答案:

答案 0 :(得分:3)

在这两种情况下,你都会得到浅#34; collecion的副本,因此两个数组都将保留对相同对象的引用。

答案 1 :(得分:2)

return new ArrayList(myMap.values())将返回一个ArrayList,其中包含Map原始值的引用。没有创建值实例的副本。

请注意,如果您的Map包含重复值(即彼此相等的值),则ArrayList也将包含重复值。如果要消除重复项,则应创建一组值而不是列表。

答案 2 :(得分:2)

在任何一种情况下,你都会得到一份参考文献(所谓的“浅版”)。

没有深度复制(创建一个包含有意义的等效字段的全新对象 - 也是深度复制的)。