列表与ArrayList作为参考类型?

Jul*_*lio 22 java interface list arraylist

好的,所以我知道Set,List并且Map是接口,但是什么使得第一行代码比第二行更好?

List myArr = new ArrayList();
ArrayList myArr = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

MAK*_*MAK 35

如果您使用第一个表单,则表示您将要使用的所有内容都是List接口的功能- 没有别的,特别是任何实现它都没有额外添加.这意味着你可以很容易地改变所使用的实现(例如,刚刚替补LinkedList用于ArrayList在实例化),而不用担心它打破了代码的其余部分,因为你可能已经用具体的东西ArrayList.

  • 当你提到在Collections.checkedList()中包装你的ArrayList以进行调试时,我认为这个案例可以更具吸引力.当你提到LinkedList时,人们会说"为什么我会使用LinkedList?". (2认同)

mik*_*era 13

有关编程类型的有用一般原则(有时称为鲁棒性原则)如下:

  • 对你接受的东西要开明
  • 对你的排放要保守

List比ArrayList更自由,因为List可以是任何类型的List实现,例如ArrayList,LinkedList或FrancosSpecialList.因此,自由主义并接受任何类型的列表是一个好主意,因为您可能希望稍后更改实现.

将ArrayList显式用作类型(第二种情况)的主要原因是,如果需要使用特定于ArrayList的方法,这些方法不能通过List接口使用.在这种情况下,通用List将不起作用(除非你想做很多丑陋和令人困惑的转换),所以你也可以显式并直接使用ArrayList.这有一个额外的好处,即向读者暗示需要ArrayList的特定功能.


Jac*_*ack 6

ArrayList 这里的源代码可以看出,实现的大多数方法都是注释的,@override因为所有这些方法都是通过List接口定义的,如果你只使用基本功能(那就是你大部分时间都要做的)差异不会是任何实际的差异.

如果有一天你会认为它的特征ArrayList不再适用于你的问题并且你需要不同的东西(LinkedList例如),那么差异就会到来.如果您将所有内容声明为List实例化,ArrayList则可以通过更改实例化来轻松切换到新实现,new ArrayList()而在其他情况下,您还必须更改所有变量声明.

使用List list = new ArrayList()更多OOP样式,因为您声明您不关心列表的特定实现,并且您想要丢弃有关该类型的静态信息,因为您将依赖于此类集合提供的接口从其中抽象出来实现.