创建链接列表

时间:2014-10-24 12:34:20

标签: java linked-list

如果我像这样创建LinkedList

LinkedList<Integer> Mistery = new LinkedList<>();

可以实现这一点:Mistery.getFirst();

另一方面,如果我创建一个这样的LinkedList:

List<Integer> Mistery = new LinkedList<>();

无法在getFirst()列表中实施Mistery方法。

为什么?

3 个答案:

答案 0 :(得分:3)

因为您将Mistery声明为超级类型:List(尽管您选择了LinkedList作为实现),但在List界面中,没有getFirst() 1}}方法定义。

答案 1 :(得分:3)

List<Integer> Mistery = new LinkedList<>();

通过这种方式声明变量,你告诉编译器:我想使用List。我想要的List的实现是LinkedList,但其余代码不应该知道。它需要知道的是它是一个列表。我可能稍后改变主意并使用ArrayList,其余的代码仍然会编译,因为ArrayList也是一个List。我还可以将另一个对象分配给同一个变量,这个对象可能是ArrayList,CopyOnWriteArrayList或任何其他类型的List。

由于List没有getFirst()方法,因此您无法使用它:变量的类型为List,而不是LinkedList。在运行时,确定该对象的类型为LinkedList。但编译器只知道变量的类型。它在运行时不知道它的具体类型。

附注:Java变量应以小写字母开头,以遵守标准约定。

答案 2 :(得分:1)

要考虑的事情也是你想要使用List的原因。 (答案已经涵盖了为什么List没有getFirst()方法)。

假设您有一个打印列表内容的方法:

public printStuff(List list){
   for(Object element: list){
       System.out.println(element);}

通过将您的Mistery列表声明为List,这意味着您可以(通过polymorphism)对一系列列表使用单一方法,即

List<Integer> Mistery = new LinkedList<>();
List<Integer> Mistery2 = new ArrayList<>();
List<String> Mistery3 = new ArrayList<>();
//etc

然后你可以这样做:

printStuff(Mistery);
printStuff(Mistery2);
printStuff(Mistery3); //can even print out a List which contains Strings

如果List声明为此LinkedList<Integer> Mistery = new LinkedList<>();,则可以使用方法printStuff。您还应该阅读casting