很多时候我看到Arraylist的实例化是以“
的方式完成的List<Object> listObject = new ArrayList<Object>();
所以我想知道以这种方式实例化Arraylist的重要性是什么?如果我们像
那样实例化ArrayList()会发生什么ArrayList<Object> listObject = new ArrayList<Object>();
答案 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)
答案 4 :(得分:0)
List
是一个接口,ArrayList
是一个类。最佳实践说:针对接口的程序,而不是具体的类。
实际上,这两个定义之间可能没有区别(将变量类型定义为接口与类),但使用List
会使您的代码依赖于接口,而不是类。然后,您可以稍后更改变量的实际类型,而不会影响使用变量的代码。
答案 5 :(得分:0)
因为您可以使用同一interface
的不同实现(在这种情况下,您可能希望将列表实现更改为linkedList
而不是ArrayList
})无需更改代码。
答案 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
进行声明。但是,如果应该对该数据结构起作用的一组算法是众所周知的,那么使用一个具体的实现类(即ArraysList
,LinkedList
)来确保这些算法的最佳性能。