Java中的ArrayList或List声明

Adi*_*dil 62 java arraylist

这两个声明有什么区别?

声明1:

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

宣言2:

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

kos*_*osa 58

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

是通用的,您希望隐藏实现细节,同时将其返回给客户端,稍后您可以将实现从透明更改ArrayListLinkedList透明.

在您设计库等的情况下,此机制非常有用,这可能会在某些时间点更改其实现细节,而客户端的更改很少.

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

这要求你总是需要返回ArrayList.在某些时候,如果您想要将实现细节更改为LinkedList,则客户端也应该进行更改LinkedList而不是使用ArrayList.

  • 并且不要忘记Collections类完全使用List接口,所以像Collections.emptyList,Collections.synchronizedList Collections.unmodifiableList这样的东西都返回List.因此,如果API需要ArrayList,那么如果要使用这些方法包装现有列表,则运气不佳. (2认同)

Dha*_*tel 12

List是一个接口,ArrayList是List接口的一个实现.该ArrayList班只有几个方法(i.e clone(), trimToSize(), removeRange() and ensureCapacity())除了在列表界面中可用的方法.这没有太大区别.

   1. List<String> l = new ArrayList<>();
   2. ArrayList<String> l = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

如果使用第一个,则可以调用List接口中可用的方法,并且无法调用ArrayList类中可用的新方法.ArrayList如果您使用第二个方法,则可以自由使用所有可用方法.

我会说第一种方法是更好的方法因为,当你开发java应用程序时,当你应该将集合框架对象作为方法的参数传递时,那么最好采用第一种方法.

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

在将来由于性能限制,如果要更改要使用的实现LinkedList或其他实现List接口的类,而不是ArrayList,只需要在一点(实例化部分)进行更改.

List<String> l = new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)

否则,您应该在所有地方进行更改,无论何处,您都使用特定的类实现作为方法参数.


Tho*_*mas 7

区别在于变体1强制您使用ArrayListwhile变体2仅保证您有任何实现List<String>.

稍后你可以List<String> arrayList = new LinkedList<String>();毫不费力地改变它.变体1可能要求您不仅要更改该行,还要更改其他部分,如果它们依赖于使用ArrayList<String>.

因此我List<String>几乎在任何情况下都会使用,除非我需要调用提供的其他方法ArrayList(到目前为止从未如此):ensureCapacity(int)trimToSize().