原因 - List list = new ArrayList();

cod*_*leb 27 java list arraylist

我见过很多次这样的代码:

List<String> list = new ArrayList<String>();

为什么人们采用ArrayList(和其他类)的父代替生成对象的类型?

这会降低性能吗?或者为什么有人这样做?

MD *_*med 38

当有人写这样的代码时,他/她正试图遵循基本的OO设计原则,该原则说 -

编程到接口,而不是具体实现

我在我的一篇博文中解释了这个原则.看看这一Class Inheritance VS Interface Inheritance节.

总结一下这篇文章,当您使用父类型的引用来引用子类型的实例时,您将获得很大的灵活性.例如,如果您将来需要更改子类型实现,则可以轻松地执行此操作,而无需更改大量代码.

考虑以下方法 -

public void DoSomeStuff(Super s) {
    s.someMethod();
}
Run Code Online (Sandbox Code Playgroud)

并调用此方法 -

DoSomeStuff(new Sub());
Run Code Online (Sandbox Code Playgroud)

现在,如果您需要更改内部逻辑someMethod,您可以通过声明一个新的子类型Super,比如说NewSubType,并更改该实现中的逻辑来轻松实现.通过这种方式,您将永远不必触及使用该方法的其他现有代码.您仍然可以DoSomeStuff通过以下方式使用您的方法 -

DoSomeStuff(new NewSubType());
Run Code Online (Sandbox Code Playgroud)

假如你声明的参数DoSomeStuff是的Sub,你将不得不改变其实施过-

DoSomeStuff(NewSubType s) {
    s.someMethod();
}
Run Code Online (Sandbox Code Playgroud)

它也可能链接/冒泡到其他几个地方.

就收集示例而言,这使您可以更改变量指向的列表实现,而不会有太多麻烦.您可以轻松使用LinkedList代替ArrayList.

  • "程序接口,而不是具体实现"是一个很好的建议.但是,它不是真正的参数`List <String> list = new ArrayList <String>();`因为a)由于构造函数,这段代码仍然与ArrayList绑定,而b)它更多地是关于API设计而不是私人实施.这是你从一开始就学到的java东西之一,这是不合理的.通常,实现提供了一些细节,如果您坚持使用该接口,您将永远不会看到这些细节.当然,答案仍然很好.(1) (3认同)

Mar*_*oun 12

当你写:

List<String> list = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

然后,您确定只使用界面 的功能List.
(ArrayList实现List,因此List更灵活).使用此功能,您可以ArrayList在将来将其更改为其他类型(例如LinkedList..).


chr*_*her 11

这意味着您可以list在任何位置交换实现List接口的任何类型,而不是创建只能使用的刚性模型ArrayList.例如:

private List<String> list;

public SomeConstructor()
{
     // At this point, you can make it any type of object you want.
     list = new ArrayList<String>();
     list = new LinkedList<String>();
     list = new AttributeList<String>();
}
Run Code Online (Sandbox Code Playgroud)

这将是abstract您使用该list对象的代码,远离细节,如确切的对象类型list.它需要知道的是它有add方法等.这称为松耦合.


Max*_*tin 5

解决问题:

为了更灵活,您可以启动界面List:

所以如果你不需要全部ArrayList使用List.

你可以写类似:List<String> = Arrays.asList("aa", "bb","cc").

当然,较少的功能可以帮助提高性能.如您所知,如果您想使用多线程应用程序,请改用Vector它,但这会降低您的性能.

在此输入图像描述

这里开始

  • http://www.wilsonmar.com/1arrays.htm (2认同)