原因 – List list = new ArrayList();

我已经多次看过这样的代码了:

List list = new ArrayList();

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

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

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

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

我在我的一篇博文中解释了这个原则。 查看“ Class Inheritance VS Interface Inheritance部分。

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

考虑以下方法 –

 public void DoSomeStuff(Super s) { s.someMethod(); } 

并调用此方法 –

 DoSomeStuff(new Sub()); 

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

 DoSomeStuff(new NewSubType()); 

如果您将DoSomeStuff的参数声明为Sub ,那么您还必须更改其实现 –

 DoSomeStuff(NewSubType s) { s.someMethod(); } 

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

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

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

 private List list; public SomeConstructor() { // At this point, you can make it any type of object you want. list = new ArrayList(); list = new LinkedList(); list = new AttributeList(); } 

这将abstract使用list对象的代码,而不是像确切的对象类型list那样的细节。 它需要知道的是它有add方法等。这叫做Loose Coupling 。

当你写:

List list = new ArrayList();

然后,您确定只使用接口 List的function。
ArrayList实现List ,因此List更灵活)。 使用它,允许您将来将ArrayList更改为其他类型(如LinkedList ..)。

解决问题:

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

因此,如果您不需要所有ArrayList只使用List

你可以这样写: List = Arrays.asList("aa", "bb","cc")

当然,较少的function可以帮助提高性能。 如您所知,如果您想使用multithreading应用程序,请使用Vector但这会降低您的性能。

在此处输入图像描述

从这里开始

因为方法不必知道您使用的列表实现。

方法只需要知道它是一个列表。

仍然可以使用该方法。

始终编​​程到接口,而不是具体实现。 (在这种情况下列表)

通常,最好使用Interface类(在本例中为List ),以便在需求发生变化时,以后可以使用任何List实现代替最小的烦恼。

虽然ArrayList可能支持一些不在List接口上的方法,但是这个声明清楚地表明那些额外的方法在这种情况下是不相关的。

 List list = new ArrayList(); 

在集合框架中, List是一个接口,而ArrayList是实现的。 您这样做的主要原因是将代码与接口的特定implementation分离,如果您希望将来转移到List其他实现,这将有所帮助。