【问题标题】:Arrays.asList(T[] array)?Arrays.asList(T[] 数组)?
【发布时间】:2011-07-27 17:42:21
【问题描述】:

所以有 Arrays.asList(T... a) 但这适用于可变参数。

如果我已经在T[] a 中有数组怎么办?有没有一种方便的方法可以从中创建List<T>,还是我必须手动执行:

static public <T> List<T> arrayAsList(T[] a)
{
   List<T> result = new ArrayList<T>(a.length);
   for (T t : a)
     result.add(t);
   return result;
}

【问题讨论】:

    标签: java arrays collections


    【解决方案1】:

    仅仅因为它适用于可变参数并不意味着你不能正常调用它:

    String[] x = { "a", "b", "c" };
    List<String> list = Arrays.asList(x);
    

    唯一棘手的一点是如果TObject,您应该使用强制类型转换来告诉编译器是否应该将参数包装在一个数组中:

    Object[] x = ...;
    List<Object> list = Arrays.asList((Object[]) x);
    

    Object[] x = ...;
    List<Object[]> list = Arrays.asList((Object) x);
    

    【讨论】:

    • 进一步澄清,据我了解,这是因为可变参数和数组相当于编译器,所以任何时候看到可变参数,都可以使用相同类型的数组。
    • 奇怪!我一直认为 varargs 函数只能在它们的 collect-arguments-as-an-array 模式下调用。
    • @JasonS 不,数组表示法完全可以与可变参数表示法互换。您甚至可以使用public static void main(String... args){} 创建一个主类。
    【解决方案2】:

    您可能已经知道,有一个名为java.util.Collections 的静态类,它有许多有用的方法来处理智能数组,例如搜索和排序。

    至于您的问题,Collection 接口指定了 addremovetoArray 等方法。出于某种原因,API 的作者决定 addaddAll 方法将是提供给用户的唯一输入函数。

    为什么 Java 列表不能添加对象数组的一个解释是,列表使用迭代器,迭代器在滚动(即转到下一个值)方面比不必具有所有索引值的数组更严格 i=(1, 2, 5, 9, 22, ...).

    另外,数组不是类型安全的;也就是说,它们不能保证其所有元素都符合特定的超类或接口,而泛型(List 是其中的成员)可以保证类型安全。因此,列表有机会使用add 方法验证每个项目。

    我认为您可以放心,将数组添加到列表中的方法是在 Java 中实现此效果的最(如果不是最)有效的方法之一。

    【讨论】:

    • 我不确定你在回答什么问题,但不是我问的那个。
    • 第一段无关紧要,第二段是CollectionList接口的背景信息。第 3 和第 4 段解释了为什么 ** 没有更直接的方式(与您的方式相反)从数组创建 List&lt;T&gt;。我希望这有助于澄清我的答案。
    猜你喜欢
    • 2010-11-17
    • 1970-01-01
    • 2015-06-18
    • 2014-10-18
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多