ArrayList o statement de lista en Java

¿Cuál es la diferencia entre estas dos declaraciones?

Declaración 1:

ArrayList arrayList = new ArrayList(); 

Declaración 2:

 List arrayList = new ArrayList(); 

 List arrayList = new ArrayList(); 

Es genérico en el que desea ocultar detalles de implementación mientras lo devuelve al cliente, en un momento posterior puede cambiar la implementación de ArrayList a LinkedList transparente.

Este mecanismo es útil en casos en los que diseñe bibliotecas, etc., que pueden cambiar los detalles de implementación en algún momento con cambios mínimos en el lado del cliente.

 ArrayList arrayList = new ArrayList(); 

Esto exige que siempre tenga que devolver ArrayList . En algún momento, si desea cambiar los detalles de implementación a LinkedList , también debe haber cambios en el lado del cliente para usar LinkedList lugar de ArrayList .

List es una interfaz y ArrayList es una implementación de la interfaz List. La clase ArrayList tiene solo unos pocos métodos (ie clone(), trimToSize(), removeRange() and ensureCapacity()) además de los métodos disponibles en la interfaz de la Lista. No hay mucha diferencia en esto.

  1. List l = new ArrayList<>(); 2. ArrayList l = new ArrayList<>(); 

Si usa el primero, podrá llamar a los métodos disponibles en la interfaz de Lista y no podrá hacer llamadas a los nuevos métodos disponibles en la clase ArrayList . Mientras que, puede usar todos los métodos disponibles en ArrayList si usa el segundo.

Yo diría que el primer enfoque es mejor porque, cuando estás desarrollando aplicaciones Java, cuando se supone que debes pasar los objetos del framework de recolección como argumentos a los métodos, entonces es mejor ir con el primer enfoque.

 List l = new ArrayList<>(); doSomething(l); 

En el futuro, debido a restricciones de rendimiento, si está cambiando la implementación para usar LinkedList u otras clases que implementan la interfaz de List , en lugar de ArrayList , debe cambiar solo en un punto (la parte de creación de instancias).

 List l = new LinkedList<>(); 

De lo contrario, se supondrá que debes cambiar en todos los lugares, donde sea, has utilizado la implementación de clase específica como argumentos de método.

La diferencia es que la variante 1 obliga a usar una ArrayList mientras que la variante 2 solo garantiza que tiene algo que implemente List .

Más tarde, podría cambiar eso a List arrayList = new LinkedList(); sin mucha molestia. La Variante 1 podría requerir que cambie no solo esa línea, sino también otras partes si confían en trabajar con una ArrayList .

Por lo tanto, utilizaría List en casi cualquier caso, excepto cuando necesite llamar a los métodos adicionales que proporciona ArrayList (que nunca fue el caso hasta ahora): ensureCapacity(int) y trimToSize() .

La primera statement tiene que ser una ArrayList, la segunda se puede cambiar fácilmente a otro tipo de lista. Como tal, se prefiere el segundo ya que deja en claro que no requiere una implementación específica. (A veces realmente necesitas una implementación, pero eso es raro)

Básicamente le permite a Java almacenar varios tipos de objetos en una implementación de estructura, por statement de tipo genérico (como class MyStructure ), que es una de las características principales de Javas.

Los enfoques orientados a objetos se basan en modularidad y reutilización por separación de preocupaciones: la capacidad de utilizar una estructura con cualquier tipo de objeto (siempre que obedezca unas pocas reglas).

Podrías simplemente crear una instancia de las cosas como sigue:

 ArrayList list = new ArrayList(); 

en lugar de

 ArrayList list = new ArrayList<>(); 

Al declarar y usar tipos generics, está informando una estructura del tipo de objetos que administrará y el comstackdor podrá informarle si está insertando un tipo ilegal en esa estructura, por ejemplo. Digamos:

 // this works List list1 = new ArrayList(); list1.add(1); list1.add("one"); // does not work List list2 = new ArrayList<>(); list2.add(1); // compiler error here list2.add("one"); 

Si desea ver algunos ejemplos, consulte la documentación de la documentación :

 /** * Generic version of the Box class. * @param  the type of the value being boxed */ public class Box { // T stands for "Type" private T t; public void set(T t) { this.t = t; } public T get() { return t; } } 

Entonces podrías instanciar cosas como:

 class Paper { ... } class Tissue { ... } // ... Box boxOfPaper = new Box<>(); boxOfPaper.set(new Paper(...)); Box boxOfTissues = new Box<>(); boxOfTissues.set(new Tissue(...)); 

Lo principal a extraer de esto es que estás especificando qué tipo de objeto deseas encasillar.

En cuanto a usar el Object l = new ArrayList<>(); , no está accediendo a la implementación de List o ArrayList , por lo que no podrá hacer mucho con la colección.

Es fácil cambiar la implementación a List to Set :

 Collection stringList = new ArrayList(); //Client side stringList = new LinkedList(); stringList = new HashSet(); //stringList = new HashSet<>(); java 1.7 and 1.8 

Hay algunas situaciones en las que puede preferir que el primero mejore (ligeramente) el rendimiento, por ejemplo, en algunas JVM sin un comstackdor JIT .

Fuera de ese tipo de contexto muy específico, debes usar el primero.

Posiblemente pueda consultar este enlace http://docs.oracle.com/javase/6/docs/api/java/util/List.html

List es una interfaz.ArrayList, LinkedList, etc. son clases que implementan list.Whenyou using List Interface, tiene que itearte elementos usando ListIterator y puede moverse hacia adelante y hacia atrás, en la Lista donde como en ArrayList Iterar usando Iterator y sus elementos pueden ser se accede de forma unidireccional.

List es la interfaz y ArrayList se implementa en la clase concreta. Siempre se recomienda usar.

 List arrayList = new ArrayList(); 

Porque aquí la lista de referencia es flexible. También puede contener LinkedList or Vector objeto LinkedList or Vector .

Siempre que haya visto encoding de una comunidad de código abierto como Guava y de Google Developer (Android Library) utilizaron este enfoque

 List strings = new ArrayList(); 

porque es ocultar los detalles de implementación del usuario. Usted precisamente

 List strings = new ArrayList(); 

es enfoque genérico y este enfoque especializado

 ArrayList strings = new ArrayList(); 

Para referencia: Effective Java 2nd Edition: Elemento 52: consulte los objetos por sus interfaces