List <object> listObject = new ArrayList <object>()?</object> </object>

时间:2013-06-12 06:41:56

标签: java arraylist

很多时候我看到Arraylist的实例化是以“

的方式完成的
List<Object> listObject = new ArrayList<Object>();

所以我想知道以这种方式实例化Arraylist的重要性是什么?如果我们像

那样实例化ArrayList()会发生什么
ArrayList<Object> listObject = new ArrayList<Object>();

10 个答案:

答案 0 :(得分:7)

List是一个接口,ArrayList类是该接口的特定实现。

List<Object> listObject = new ArrayList<Object>();

通过此操作,您可以在以后更改List实施。 List listObject可以调用List接口中声明的所有方法。将来,如果您不希望ArrayList实施List,并使用LinkedList进行更改,则可以执行此操作:

List<Object> listObject = new LinkedList<Object>();

如果您已将listObject声明为listObject接口类型,则不必更改使用List的代码,并且不必担心它会破坏其余代码,因为您可能已使用此声明使用了ArrayList特定的内容:

ArrayList<Object> listObject = new ArrayList<Object>();

这称为编程到接口,而不是实现。

答案 1 :(得分:2)

这是因为将代码写入接口而不是实现始终是一种很好的做法。因此,当您执行List<Object> listObject = new ArrayList<Object>();时,您始终可以自由地将ArrayList更改为LinkedList,而代码中的其他位置则无需更改。因此,编程到接口(List)可以让您自由/有能力更改底层实现,而不会影响代码中的其他位置。我建议你阅读this small note以便更清晰。

答案 2 :(得分:0)

两个示例中的列表实现之间没有区别。但是,您可以在代码中进一步使用变量myList。

将列表定义为:

 List myList = new ArrayList();

您只能调用属于List类的方法和引用成员。如果您将其定义为:

ArrayList myList = new ArrayList();

除了从List继承的成员之外,您还可以调用特定于ArrayList的方法并使用ArrayList特定成员。

然而,当您在第一个示例中调用List类的方法(在ArrayList中重写)时,将调用ArrayList中的方法而不是List中的方法。

这就是所谓的多态性。

答案 3 :(得分:0)

这将是“编程到接口而不是实现”

请查看thisthis

答案 4 :(得分:0)

List是一个接口,ArrayList是一个类。最佳实践说:针对接口的程序,而不是具体的类

实际上,这两个定义之间可能没有区别(将变量类型定义为接口与类),但使用List会使您的代码依赖于接口,而不是类。然后,您可以稍后更改变量的实际类型,而不会影响使用变量的代码。

答案 5 :(得分:0)

因为您可以使用同一interface 的不同实现(在这种情况下,您可能希望将列表实现更改为linkedList而不是ArrayList })无需更改代码。

Why should the interface for a Java class be preferred?

答案 6 :(得分:0)

Java 7 开始,这些是List

的已知实现
  

所有已知的实施课程:
   AbstractList,AbstractSequentialList,   ArrayList,AttributeList,CopyOnWriteArrayList,LinkedList,RoleList,   RoleUnresolvedList,Stack,Vector

除了Abstract类之外,这意味着将来如果你想插入除ArrayList之外的其他List实现,你有多种选择。

也称为Coding to Interfaces,这是一种广泛使用的编程范例。

答案 7 :(得分:0)

使用List时,您使用抽象。对存在函数调用的情况进行成像需要List<Object>

List<Object> myList = myFunction();

现在在函数myFunction()中, 它更好用

List<Object> myList = new ArrayList<Object>();
return myList;

ArrayList<Object> myList = new ArrayList<Object>();

因为你会避免不必要的施法。调用函数只需要List,无论其实现如何。

此外,List界面提供了许多适用于所有实现的通用函数。因此,您可以编写一些通用代码来操作列表,而不管其是LinkedList还是ArrayList。这是使用Abstraction的优势。

答案 8 :(得分:0)

列表是一个接口。当您将接口定义为引用时,我们必须使用它的实现来实例化。

答案 9 :(得分:0)

大多数答案都是指“编码到界面”的口号。虽然这是一个合理的建议,但可能会导致一些问题。具体来说,在List的情况下,对象listObject的用户对底层数据结构的效率一无所知。例如,如果这是ArrayList的实例,则获取最后一个元素仅为O(1),而如果它是LinkedList则为O(listObject.size)

因此,通常了解确切的基础数据结构非常重要,这可以通过使用变量声明的实现类型来实现。例如,Scala的List是一个使其数据结构明确的类。

因此,我会一如既往地说,决定应该是一个明智的决定,并迎合您的应用程序的设计。如果数据结构应该是“列表”并且不知道具体实现的要求,那么使用List进行声明。但是,如果应该对该数据结构起作用的一组算法是众所周知的,那么使用一个具体的实现类(即ArraysListLinkedList)来确保这些算法的最佳性能。