2015-04-13 3 views
2

В чем разница между использованием типизированного или не типизированного ArrayList в Java?Типизированный или не типизированный ArrayList

Например, используя ArrayList из CustomObject:

Введенные:

ArrayList<CustomObject> typedArray = new ArrayList<>(); 
typedArray.add(new CustomObject); 

или не наберется:

ArrayList<> nonTypedArray = new ArrayList<>(); 
nonTypedArray.add(new CustomObject); 

Есть ли ситуация, когда предпочтительным является последней? Есть ли разница, когда ArrayList имеет разные типы данных, например. ArrayList String, Int и т. д.?

+0

Ну, это зависит от того, что вам нужно. –

+0

@ DarshanLila Пожалуйста, уточните, что вы подразумеваете под требованием. Я только намерен выполнять функции сортировки и т. Д. – Marcus

+0

Если вам нужен «Список», который строго должен содержать те же типы, которые вы вводите для ввода или иным образом. Но обычно типизируются коллекции. –

ответ

3

Нельзя использовать последний вариант. Я не думаю, что это возможно. Я думаю, вы имели в виду:

ArrayList nonTypedArray = new ArrayList(); 

Этот синтаксис оставлен с Java 1.4 и ранее. Он по-прежнему компилируется для обеспечения обратной совместимости.

В Java 1.5 были введены Generics, которые позволяли вам указывать типы между угловыми скобками.

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

То есть, если вы укажете

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

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

Конечно, Generics обеспечивает безопасность типа во время компиляции. Во время выполнения ArrayList<String> typedArray = new ArrayList<String>(); становится ArrayList typedArray = new ArrayList();. Это должно поддерживать обратную совместимость.

+0

* «Я не думаю, что это возможно». * Вы правы, это не так. Я подозреваю, что OP видел правильное использование алмаза, как 'ArrayList a = новый ArrayList <>();' и запутался. – Radiodef

4

Во втором подходе необязательно добавлять только CustomObject, где он находится в 1-м подходе, иначе вы получите сообщение об ошибке компиляции.

ArrayList<CustomObject> typedArray = new ArrayList<>(); 
typedArray.add(new CustomObject); 

Этот подход, как правило, предпочтительнее, так как нет возможности наличия класса Cast исключение, а во втором подходе есть высокие шансы на это !!

JavaDocs объясняет это красиво: Why to prefer Generics

  1. Stronger проверки типов во время компиляции.
  2. Устранение отливок.
  3. Включение программистов для реализации общих алгоритмов.
+0

* «В Second Approach необязательно добавлять только CustomObject» * Это полностью выдумано ... Вы размышляете о несуществующем синтаксисе. Второй подход - это ошибка компилятора. Это не означает * ничего *. – Radiodef

+1

@Radiodef, да это ошибка компиляции, но когда я дал ответ, второй подход был таким: ArrayList nonTypedArray = new ArrayList(); 'not' ArrayList <> nonTypedArray = new ArrayList <>(); ' –

+0

Я не сделал внесите изменения в вопрос. Но 'ArrayList <> nonTypedArray = new ArrayList <>();' это ошибка компиляции, она должна быть 'ArrayList nonTypedArray = new ArrayList();'. Я не редактировал свой вопрос, так как некоторые ответы были рассмотрены, и это может вызвать путаницу, если я удалю его из вопроса. – Marcus

0

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

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

1

В чем разница между использованием типизированной против не-typedArrayList в Java?

Типичный/Generic ArrayList представляет собой набор объектов, в которых «Тип» объекта определен в квадратных скобках. В Java 5 были введены дженерики для создания коллекций типов. До Generics коллекцию называли Untyped/Raw Type Collection, потому что не было способа указать компилятору тип создаваемой коллекции. Разница между ними заключается в обнаружении операций типа-типа во время компиляции.

В обоих случаях вы добавляете объекты (объекты) типа «CustomObject» в ArrayList. При добавлении элементов в список не будет проблем, так как оба списка будут рассматривать его как Object.

Введенные:

ArrayList<CustomObject> typedArray = new ArrayList<>(); 
typedArray.add(new CustomObject); 

Нетипизированные:

ArrayList<> nonTypedArray = new ArrayList<>(); 
nonTypedArray.add(new CustomObject); 

Есть ли ситуация, когда предпочтительным является последней?

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

Есть ли какая-либо разница, когда ArrayList держит разные datat-ypes, например. ArrayList из String, Int и т. д.?

Несомненно, существует разумная разница. Для нетипизированного списка вам нужно будет добавить тип-литье, извлекая элементы из списка. Как, есть возможность компилятора бросать ClassCastException во время выполнения из-за различных типов элементов.

0

Да, я знаю, что это старый пост. Но я хотел бы поделиться экземпляром, где полезен нетипизированный ArrayList: когда вы пишете функцию, которая должна действовать на произвольные типы элементов. Например, предположим, что вы хотите создать общую функцию тасования, которая знает, как перетасовать массив. Как так:

ArrayList<Die> diceRolls = getGetPossibleDiceRolls(); 
ArrayList<Card> cardDeck = getPossibleCards(); 
ArrayList<GirlToDate> blackbook = getBlackbook(); 
shuffle(diceRolls); 
shuffle(cardDeck); 
shuffle(blackbook); 

. 
. 
void shuffle(ArrayList array) { 
    int size = array.size(); 
    for (int i=0; i<size; ++i) { 
     int r = random.nextInt(size - i) + i; 

     // Swap 
     Object t = array.get(i); 
     array.set(i, array.get(r)); 
     array.set(r, t); 
    }  
} 

Некоторые могут возразить: «Да, но правильный способ сделать это, чтобы создать интерфейс или подкласс что-то вроде Shuffleable типа ...» Но на самом деле?

+1

* «Некоторые могут спорить« да », но правильный способ сделать это - создать интерфейс или подкласс чего-то типа типа« Shuffleable »...» «* Правильный путь был бы подстановочным знаком. – Tom

0

В Java 1.7 и выше обычно следует использовать конструктор, как это:

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

или же для более общего List объекта:

List<MyObject> list = new ArrayList<>(); 

Заметим, что вы только указать тип <MyObject> раз , а не дважды. Это упрощает работу с вашим кодом.<> заставляет конструктор возвращать ArrayList, который уже набран в соответствии с полем/переменной, к которой он назначен, - чтобы в вызывающем коде не требовалось никакого приведения.

Не используйте new ArrayList() в качестве конструктора. Это возвращает нетто-кодArrayList, который затем должен быть присвоен типу, соответствующему полю/переменной, которому он назначен. Это означает ненужную проверку типов и литье и, как правило, снижает производительность.

Смежные вопросы