Объявление ArrayList или List в Java

В чем разница между этими двумя декларациями?

Декларация 1:

ArrayList<String> arrayList = new ArrayList<String>();

Декларация 2:

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

10 ответов

Решение
List<String> arrayList = new ArrayList<String>();

Является универсальным, когда вы хотите скрыть детали реализации при возврате их клиенту, в более поздний момент времени вы можете изменить реализацию с ArrayList в LinkedList прозрачно.

Этот механизм полезен в тех случаях, когда вы проектируете библиотеки и т. Д., Которые могут изменить детали их реализации в определенный момент времени с минимальными изменениями на стороне клиента.

ArrayList<String> arrayList = new ArrayList<String>();

Это мандаты вы всегда должны вернуться ArrayList, В какой-то момент, если вы хотите изменить детали реализации на LinkedList, должны быть изменения на стороне клиента, чтобы использовать LinkedList вместо ArrayList,

List это интерфейс и ArrayList является реализацией интерфейса List. ArrayList класс имеет всего несколько методов(i.e clone(), trimToSize(), removeRange() and ensureCapacity()) в дополнение к методам, доступным в интерфейсе списка. В этом нет большой разницы.

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

Если вы используете первое, вы сможете вызывать методы, доступные в интерфейсе List, и не сможете вызывать новые методы, доступные в ArrayList учебный класс. Где, как, вы можете использовать все методы, доступные в ArrayList если вы используете второй.

Я бы сказал, что первый подход лучше, потому что, когда вы разрабатываете Java-приложения, когда вы должны передавать объекты каркаса коллекции в качестве аргументов методам, тогда лучше использовать первый подход.

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

В будущем из-за ограничений производительности, если вы меняете реализацию для использования LinkedList или некоторые другие классы, которые реализуют List интерфейс, а не ArrayListВам нужно изменить только одну точку (часть создания экземпляра).

List<String> l = new LinkedList<>();

В противном случае вы должны будете изменить все места, где бы вы ни использовали конкретную реализацию класса в качестве аргументов метода.

Разница в том, что вариант 1 заставляет вас использовать ArrayList в то время как вариант 2 только гарантирует, что у вас есть все, что реализует List<String>,

Позже вы можете изменить это на List<String> arrayList = new LinkedList<String>(); без особых хлопот. Вариант 1 может потребовать от вас изменить не только эту линию, но и другие части, если они полагаются на работу с ArrayList<String>,

Таким образом, я бы использовал List<String> почти в любом случае, кроме случаев, когда мне нужно вызвать дополнительные методы, которые ArrayList обеспечивает (чего никогда не было до сих пор): ensureCapacity(int) а также trimToSize(),

Легко изменить реализацию на List в Set:

Collection<String> stringList = new ArrayList<String>();
//Client side
stringList = new LinkedList<String>();

stringList = new HashSet<String>();
//stringList = new HashSet<>(); java 1.7 and 1.8

Первое объявление должно быть ArrayList, второе может быть легко изменено на другой тип List. Таким образом, второй вариант предпочтительнее, поскольку он дает понять, что вам не требуется конкретная реализация. (Иногда вам действительно нужна одна реализация, но это редко)

В основном это позволяет Java хранить несколько типов объектов в одной реализации структуры посредством объявления универсального типа (например, class MyStructure<T extends TT>), что является одной из главных особенностей Javas.

Объектно-ориентированные подходы основаны на модульности и возможности повторного использования путем разделения интересов - способности использовать структуру с любым типом объекта (если он подчиняется нескольким правилам).

Вы можете просто создать такие вещи следующим образом:

ArrayList list = new ArrayList();

вместо

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

Объявляя и используя универсальные типы, вы информируете структуру того типа объектов, которыми он будет управлять, и компилятор сможет сообщить вам, например, если вы вставляете недопустимый тип в эту структуру. Скажем так:

// this works
List list1 = new ArrayList();
list1.add(1);
list1.add("one");

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

Если вы хотите увидеть некоторые примеры, проверьте документацию документации:

/**
 * Generic version of the Box class.
 * @param <T> the type of the value being boxed
 */
public class Box<T> {
    // T stands for "Type"
    private T t;

    public void set(T t) { this.t = t; }
    public T get() { return t; }
}

Тогда вы можете создать такие вещи, как:

class Paper  { ... }
class Tissue { ... }

// ...
Box<Paper> boxOfPaper = new Box<>();
boxOfPaper.set(new Paper(...));

Box<Tissue> boxOfTissues = new Box<>();
boxOfTissues.set(new Tissue(...));

Главное, что из этого следует сделать, это указать тип объекта, который вы хотите пометить.

Что касается использования Object l = new ArrayList<>();Вы не получаете доступ к List или же ArrayList реализация, так что вы не сможете многое сделать с коллекцией.

Список - это интерфейс, а ArrayList - это конкретный класс. Всегда рекомендуется использовать.

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

Потому что здесь список ссылок является гибким. Это может также держать LinkedList or Vector объект.

В некоторых ситуациях вы можете предпочесть, чтобы первая (немного) улучшила производительность, например, на некоторых JVM без JIT-компилятора.

Из такого специфического контекста вы должны использовать первый.

Возможно, вы можете обратиться к этой ссылке http://docs.oracle.com/javase/6/docs/api/java/util/List.html

List - это интерфейс.ArrayList,LinkedList и т. Д. - это классы, которые реализуют список. Когда вы используете List Interface, вы должны вставлять в него элементы, используя ListIterator, и можете двигаться вперед и назад, в List, где, как в ArrayList Iterate, используя Iterator, и его элементы доступ однонаправленным способом.

Всякий раз, когда вы видели кодирование от сообщества открытого источника, такого как Guava и от Google Developer (Android Library), они использовали этот подход

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

потому что это скрыть детали реализации от пользователя. Ты точно

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

это общий подход, и этот специализированный подход

ArrayList<String> strings = new ArrayList<String>();

Для справки: Эффективное Java, 2-е издание: пункт 52: Ссылка на объекты по их интерфейсам

Другие вопросы по тегам