【问题标题】:How List copy Set in Java?Java中如何设置List副本?
【发布时间】:2018-05-24 07:19:32
【问题描述】:

我测试了下面的代码。我预计会出现编译错误,因为我命令编译器复制“Set”。详细地说,“Hashmap.keySet()”返回“Set”而不是“List”。我曾经知道“Set”与基于上述结构的“List”不兼容。你能告诉我这段代码是如何工作的吗?

        List<String> h = new ArrayList<String>(HashMap<>.keySet());

【问题讨论】:

  • The ArrayList constructor 接受任何Collection。任何集合都可以迭代,因此构造函数可以迭代集合并将每个元素添加到列表中。
  • 正是 khelwood 所说的。 ArrayList 的构造函数只是按照Collection 的迭代器返回它们的顺序获取元素。由于SetCollection 的子类,它工作得很好。
  • HashMap&lt;&gt;.keySet() 这是不正确的。你正在调用keySet,一个实例方法,就好像它是一个静态方法一样。
  • 谢谢大家的解释>

标签: java list collections set


【解决方案1】:

HashMap&lt;&gt;.keySet() 返回一个SetSetCollectionArrayList 有一个构造函数,它接受Collection 并将Collection 的所有元素添加到List。因此,您可以将 HashMap&lt;&gt;.keySet() 传递给该构造函数。

java.util.ArrayList.ArrayList(Collection c)

按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。

【讨论】:

  • 谢谢。你对 Eran 很有帮助。
【解决方案2】:

该代码中使用的ArrayList 的构造函数采用CollectionSet 是。

【讨论】:

    【解决方案3】:

    该代码中使用的constructor of ArrayList 采用集合,即集合。

    在 ArrayList 构造函数中,它们将集合转换为数组。在 ArrayList 中,他们使用 Object[] 来存储对象。

    按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。

    public ArrayList(Collection<? extends E> c) {
         elementData = c.toArray();
         size = elementData.length;
         // c.toArray might (incorrectly) not return Object[] (see 6260652)
         if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    }
    

    【讨论】:

    • 感谢您的具体解释。我明白了。
    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2011-08-29
    • 2021-05-29
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多