Java泛型集合

Java泛型集合,java,generics,Java,Generics,我开始使用Deitel Harvey book学习Java通用集合,但我在理解下面的三行代码时遇到了困难。所有这些代码是否都通过初始化数组(颜色)的相关值并将其添加到LinkList变量(list1)来执行相同的操作。第二种方法和第三种方法是如何工作的?我很难理解数组是如何被视为列表的。。正如我所知,数组不是动态数据结构,它们具有固定大小的长度,与一般的列表相比,在运行时无法在数组上添加/删除元素 String[] colors = { "black", "white", "blue", "cy

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

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);
String[]colors={“黑色”、“白色”、“蓝色”、“青色”};
Listlist1=newlinkedlist();
//初始化并向列表中添加元素的方法1
用于(字符串颜色:颜色)
列表1.添加(颜色);
//初始化元素并将其添加到列表中的方法2
Listlist1=newlinkedlist(Arrays.asList(colors));
//初始化元素并将其添加到列表中的方法3
Listlist1=Arrays.asList(颜色);
请帮助我理解我上面的疑问,不要评判我,因为我还是新手。
谢谢,Sinan

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


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

只有第一个方法对最初分配到
列表1的
链接列表执行任何操作。另外两个为它分配一个新的、不相关的列表。第三个选项指定的内容不是
链接列表
,而是由字符串数组支持的
列表
接口的特殊实现。在第三种情况下,您将无法从列表中添加/删除元素,但可以对其进行迭代并更新现有插槽。基本上,它做的和普通数组一样,只是通过
列表
界面。

从数组创建列表。在Java中,数组通常不能被视为列表。它们只能包装在列表中


因此,在这种情况下,方法2用于具有特定的列表实现
LinkedList

实际上,泛型知识对于回答这个问题是不必要的

正确地说,标识符数组是静态的,即不能向其添加元素或删除元素

但是,通常允许这些操作

返回的
列表
具有/方法(否则它将不是有效的
列表
)。然而,实际调用这些方法将抛出一个
不支持操作异常
确切地说是,因为您不能向数组中实际添加元素(对于数组,此
列表
只是一个视图/包装器)


在结构上不修改列表的操作(即不更改列表中元素的数量)是完全可能的:在
数组返回的
列表
上可以正常工作。对于方法2,只需在此处检查Api即可: ) 当然,列表实现了Collections接口,因此该构造函数将在这里工作


对于方法3,只需在此处查看Api:…)

每当您对实现感兴趣时,您都可以查看特定的方法。例如,在方法或类上按Ctrl+鼠标左键

// method 2 of initializing and adding elements to the list
List<String> list1 = new LinkedList<String> (Arrays.asList(colors));
实际数组被复制到封装的专用数组字段(链接被复制

然后在
链接列表的构造函数中:

ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
        a = array;
    }
public LinkedList(Collection<? extends E> c) {
    this();
    addAll(c);
    }
公共链接列表(集合如果您看到下面的链接

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

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

因此,第2行和第3行都是相当有效的实现。 此外,您还可以在所有3行中观察到另一个良好的编码实践。 就是

将代码写入拦截器而不是类

(指

链接列表

举例

名单

接口)


始终尝试使用拦截器引用您的类,这是一种很好的做法

我不确定我是否遵循,您是否在问第二个和第三个方法是如何实现的?顺便问一下,您是否有任何理由在类型参数周围加空格,例如,
List
而不是
List
?后者更为传统。嗨,Amit,不,我说的是实现,我只是问这些方法是如何将数组视为列表的-我很难理解这个概念。Jon,我只是按照书的风格-请看Havery Deitel(Java如何编程)的第20章。谢谢。谢谢Marko的回复。我仍然不知道数组是如何被视为列表的-让它这样运行的背后的魔力是什么?你知道怎么做吗?谢谢。真的没有魔力。
ArrayList
也在内部使用数组。如果你感兴趣,你可以在grepcode.com.Google上轻松查看
gr的代码epcode java.util.Arrays
。谢谢你的时间,Marko。我会看一下。谢谢你,Joachim,我仍然不明白数组是如何被视为列表的?我可能无法用逻辑的方式来思考它。究竟是如何将静态行为视为动态的…@Sinan:并非所有的
列表
对象都是相同的。有些对象只允许只读访问(请参阅,其他允许所有操作(您的平均值
ArrayList
),…)。Arrays.asList创建私有类Arrays$ArrayList的实例,该实例恰好扩展了AbstractList。但是,它不会覆盖修改大小的方法(即添加、删除等)。AbstractList中的默认实现是抛出一个UnsupportedOperationException。视图方法(get、toArray)的实现方式是直接访问ar
public LinkedList(Collection<? extends E> c) {
    this();
    addAll(c);
    }