2

我开始使用 Deitel Harvey 书学习 Java 通用集合 - 但我在理解下面的三行代码时遇到困难 - 通过初始化数组(颜色)的相关值并将它们添加到 LinkList,它们是否都执行相同的操作变量(列表 1)。第二种方法和第三种方法如何工作 - 我有点难以理解如何将数组视为一个列表。我知道数组不是动态数据结构,它们具有固定大小的长度,在数组上添加/删除元素不能与一般列表相比,在运行时间上完成。

String[] colors = { "black", "white", "blue", "cyan" };
List< String > list1 = new LinkedList< String >();

// method 1 of initalizing and adding elments to the list
for (String color : colors)
    list1.add(color);

// method 2 of initializing and adding elements to the list
List< String > list1 = new LinkedList< String > (Arrays.asList(colors));

// method 3 of initializing and adding elements to the list
List< String > list1 = Arrays.asList(colors);

请帮助我理解我上面的疑问,不要评判我,因为我还是新手。谢谢你,思南

4

7 回答 7

3

实际上,回答这个问题不需要泛型知识。

由于您正确地标识符数组是静态的,因为您不能向它们添加元素或删除它们。

但是,列表通常允许这些操作。

List返回的确实/方法(否则它将不是有效的)。但是,实际上调用这些方法会抛出一个确切的问题,因为您实际上无法将元素添加到数组(这只是一个视图/包装器)。Arrays.asList() addremoveListUnsupportedOperationExceptionList

不从结构上修改列表的操作(即不改变列表中元素的数量)是完全可能的:set(int, E)List返回的Arrays.asList().

于 2012-10-09T14:36:12.563 回答
2

Arrays.asList返回由指定数组支持的固定大小的列表。

它实际上是 Array 和 Collection 框架之间的桥梁。但返回的列表写入数组。

于 2012-10-09T14:35:06.177 回答
2

只有您的第一个方法对LinkedList您最初分配到的list1. 另外两个为其分配一个新的、不相关的列表。第三个选项分配的不是,而是由您的 String 数组支持LinkedList的接口的特殊实现。List在第三种情况下,您将无法从列表中添加/删除元素,但您可以对其进行迭代并更新现有插槽。基本上,它只是通过List接口完成普通数组的工作。

于 2012-10-09T14:35:44.290 回答
1

Arrays.asList从一个数组创建一个列表。数组通常不能被视为 Java 中的列表。它们只能被包装在一个列表中。

所以在这种情况下,方法 2 用于有一个特定的列表实现LinkedList

于 2012-10-09T14:35:58.403 回答
1

对于方法 2,只需在此处检查 Api: http ://docs.oracle.com/javase/1.5.0/docs/api/java/util/LinkedList.html#LinkedList(java.util.Collection ) 当然,列表实现集合接口,这样这个构造函数就可以在这里工作。

对于方法 3,只需在此处查看 Api:http ://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T ...)

于 2012-10-09T14:37:51.617 回答
0

每次您对实现感兴趣时,您都可以研究某些方法。例如,通过在方法或类上按Ctrl+鼠标左键。

// method 2 of initializing and adding elements to the list
List<String> list1 = new LinkedList<String> (Arrays.asList(colors));

此代码导致:

List<String> list1 = new LinkedList<String> (new ArrayList<String>(colors));

在构造函数中ArrayList

ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
        a = array;
    }

实际数组被复制到封装的私有数组字段(链接被复制)。

然后在构造函数中LinkedList

public LinkedList(Collection<? extends E> c) {
    this();
    addAll(c);
    }

传递集合的每个元素都添加到LinkedList.

于 2012-10-09T14:50:15.723 回答
0

如果您看到下面的链接 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/LinkedList.html#LinkedList%28java.util.Collection%29

您将看到链表类的构造函数,它接受集合对象作为参数。

在您的帖子中,第 2 行和第 3 行正在传递集合类的对象(即 Arrays.asList 最终给出了一个 List,它是集合的子类)。

所以第二行和第三行都是相当有效的实现。此外,您可以在所有 3 行中观察到另一种良好的编码实践。那是

将代码编写到拦截器而不是类

. (指

链表

实例与

列表

界面)

总是尝试使用拦截器来引用你的类,这是一个很好的做法

于 2012-10-09T15:01:46.377 回答