3

So many time I have seen that instantiation of Arraylist is done in the manner "

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

So I am wondered that what is the significance of instantiation of Arraylist in this way? What happens if we instantiate ArrayList() like

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

using .hasClass to target multiple classes

I'm using the following code to see if a form does not contain either class. It works fine if I only look for one, but if I add multiple classes to the if statement, it seems to bypass them.

if (!form.hasClass('no-ajax') || !form.hasClass('register-step')) {

HTML:

<form id="basic-info-form" class="register-step form efocus" method="post" action="form_process.php?source=newUser">

What am I doing wrong?

4

10 回答 10

9

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

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

有了这个,您可以在将来更改List实现。List listObject可以调用List接口中声明的所有方法。将来,如果您不想ArrayList实现List,并用say a 更改它LinkedList,您可以这样做:

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

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

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

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

于 2013-06-12T06:45:29.760 回答
3

这是因为将代码编写到接口而不是实现总是一个好习惯。因此,当您这样做时,List<Object> listObject = new ArrayList<Object>();您始终可以自由地将 ArrayList 更改为 LinkedList,并且代码中的其他地方不需要更改。因此,此处对接口(列表)进行编程为您提供了更改底层实现的自由/权力,而不会影响代码中的其他位置。我建议你阅读这个小笔记以获得更清晰的信息。

于 2013-06-12T06:47:05.660 回答
2

大多数答案都提到了“对接口进行编码”的口头禅。虽然,这是一个合理的建议,但它可能会导致一些问题。具体来说,如果List对象的用户对listObject底层数据结构的效率一无所知。例如,如果这是一个实例,ArrayList那么获取最后一个元素是 only O(1),而如果它是 aLinkedList那么它是O(listObject.size)

因此,通常知道确切的底层数据结构是非常重要的,这可以通过使用实现类型进行变量声明来实现。例如,ScalaList是一个使其数据结构显式化的类。

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

于 2013-06-12T07:00:26.553 回答
1

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

当您将列表定义为:

 List myList = new ArrayList();

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

ArrayList myList = new ArrayList();

除了从 List 继承的成员之外,您将能够调用 ArrayList 特定方法并使用 ArrayList 特定成员。

然而,当您在第一个示例中调用 List 类的方法时,该方法在 ArrayList 中被覆盖,则 ArrayList 中的方法将被调用,而不是 List 中的方法。

这叫做多态性。

于 2013-06-12T06:45:21.900 回答
1

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

请看看这个这个

于 2013-06-12T06:45:55.587 回答
1

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

为什么首选 Java 类的接口?

于 2013-06-12T06:50:44.400 回答
1

Java 7开始,这些是已知的实现List

所有已知的实现类:
AbstractList、AbstractSequentialList、ArrayList、AttributeList、CopyOnWriteArrayList、LinkedList、RoleList、RoleUnresolvedList、Stack、Vector

撇开抽象类不谈,这意味着将来如果你想插入一个不同的 List 实现,而不是ArrayList你有多种选择。

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

于 2013-06-12T06:50:58.593 回答
1

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

于 2013-06-12T06:59:20.340 回答
1

List是一个接口,ArrayList也是一个类。最佳实践说:针对接口而不是具体类进行编程

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

于 2013-06-12T06:48:24.040 回答
1

当您使用时,List您使用Abstraction。想象有函数调用期望的情况List<Object>

List<Object> myList = myFunction();

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

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

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

因为您将避免不必要的强制转换。调用函数只期望 aList而与它的实现无关。

此外,List接口提供了许多适用于所有实现的通用功能。因此,您可以编写一些通用代码来操作列表,而不管它是LinkedList还是ArrayList. 这是使用Abstraction.

于 2013-06-12T06:52:45.390 回答