Объявление ArrayList или списка в Java



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



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



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


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



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

10 ответов:

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

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

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

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

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

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

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

если вы используете первый, вы сможете вызывать методы, доступные в интерфейсе списка, и вы не можете совершать вызовы новых методов, доступных в ArrayList класса. Где, как, вы можете использовать все методы, доступные в элемент ArrayList если вы используете второй.

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

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().

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

в основном это позволяет 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 реализации, так что вы не сможете сделать с коллекцией.

легко изменить реализацию на List to 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

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

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

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

список-это интерфейс.ArrayList, LinkedList и т. д.-Это классы, которые реализуют список.Когда вы используете интерфейс списка,вы должны itearte элементы с помощью ListIterator и может двигаться вперед и назад, в списке, где, как и в ArrayList итерации с помощью итератора и его элементы могут быть доступны однонаправленным способом.

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

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

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

всякий раз, когда вы видели кодирование из сообщества с открытым исходным кодом, как 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: см. объекты по их интерфейсам

Comments

    Ничего не найдено.