Чем отличается List от ArrayList?
Чем отличается List от ArrayList . Погуглил, но толком ничего не нашел (как минимум, на русском языке). Насколько я понял, ArrayList является реализацией List , однако различий я особых не заметил. Так в чем же все-таки разница?
Отслеживать
задан 21 мар 2016 в 20:51
user189127 user189127
Дык List — это интерфейс. ArrayList его реализует.
21 мар 2016 в 21:05
У интерфейса List может быть несколько реализаций. Одна из них — ArrayList. Но есть еще AbstractList, AbstractSequentialList, LinkedList, AttributeList, RoleList, RoleUnresolvedList, CopyOnWriteArrayList, LinkedList
21 мар 2016 в 21:18
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Так как ArrayList реализует интерфейс List , то у него должны быть все методы List плюс (возможно) какие-то другие. Отсюда внешняя схожесть. При этом в List эти методы вообще никак не реализованы и невозможно создать объект командой new List() .
Реализации одного и того же интерфейса могут иметь внешне одни и те же методы, но радикально отличаться их внутренней реализацией. Например, в основе ArrayList — массив, который при необходимости заменяется большим (или меньшим) по размеру с переписыванием содержимого из старого в новый. В основе же LinkedList (другой реализации интерфейса List ) лежит двунаправленный связанный список, а каждый элемент списка содержит в себе ссылку на следующий и предыдущий элементы.
Чем отличается list от arraylist java
Для создания простых списков применяется интерфейс List , который расширяет функцональность интерфейса Collection. Некоторые наиболее часто используемые методы интерфейса List:
- void add(int index, E obj) : добавляет в список по индексу index объект obj
- boolean addAll(int index, Collection col) : добавляет в список по индексу index все элементы коллекции col. Если в результате добавления список был изменен, то возвращается true, иначе возвращается false
- E get(int index) : возвращает объект из списка по индексу index
- int indexOf(Object obj) : возвращает индекс первого вхождения объекта obj в список. Если объект не найден, то возвращается -1
- int lastIndexOf(Object obj) : возвращает индекс последнего вхождения объекта obj в список. Если объект не найден, то возвращается -1
- ListIterator listIterator () : возвращает объект ListIterator для обхода элементов списка
- static List of(элементы) : создает из набора элементов объект List
- E remove(int index) : удаляет объект из списка по индексу index, возвращая при этом удаленный объект
- E set(int index, E obj) : присваивает значение объекта obj элементу, который находится по индексу index
- void sort(Comparator comp) : сортирует список с помощью компаратора comp
- List subList(int start, int end) : получает набор элементов, которые находятся в списке между индексами start и end
По умолчанию в Java есть встроенная реализация этого интерфейса — класс ArrayList . Класс ArrayList представляет обобщенную коллекцию, которая наследует свою функциональность от класса AbstractList и применяет интерфейс List. Проще говоря, ArrayList представляет простой список, аналогичный массиву, за тем исключением, что количество элементов в нем не фиксировано.
ArrayList имеет следующие конструкторы:
- ArrayList() : создает пустой список
- ArrayList(Collection col) : создает список, в который добавляются все элементы коллекции col.
- ArrayList (int capacity) : создает список, который имеет начальную емкость capacity
Емкость в ArrayList представляет размер массива, который будет использоваться для хранения объектов. При добавлении элементов фактически происходит перераспределение памяти — создание нового массива и копирование в него элементов из старого массива. Изначальное задание емкости ArrayList позволяет снизить подобные перераспределения памяти, тем самым повышая производительность.
Используем класс ArrayList и некоторые его методы в программе:
import java.util.ArrayList; public class Program < public static void main(String[] args) < ArrayListpeople = new ArrayList(); // добавим в список ряд элементов people.add("Tom"); people.add("Alice"); people.add("Kate"); people.add("Sam"); people.add(1, "Bob"); // добавляем элемент по индексу 1 System.out.println(people.get(1));// получаем 2-й объект people.set(1, "Robert"); // установка нового значения для 2-го объекта System.out.printf("ArrayList has %d elements \n", people.size()); for(String person : people) < System.out.println(person); >// проверяем наличие элемента if(people.contains("Tom")) < System.out.println("ArrayList contains Tom"); >// удалим несколько объектов // удаление конкретного элемента people.remove("Robert"); // удаление по индексу people.remove(0); Object[] peopleArray = people.toArray(); for(Object person : peopleArray) < System.out.println(person); >> >
Консольный вывод программы:
Bob ArrayList has 5 elements Tom Robert Alice Kate Sam ArrayList contains Tom Alice Kate Sam
Здесь объект ArrayList типизируется классом String, поэтому список будет хранить только строки. Поскольку класс ArrayList применяет интерфейс Collection, то мы можем использовать методы данного интерфейса для управления объектами в списке.
Для добавления вызывается метод add . С его помощью мы можем добавлять объект в конец списка: people.add(«Tom») . Также мы можем добавить объект на определенное место в списке, например, добавим объект на второе место (то есть по индексу 1, так как нумерация начинается с нуля): people.add(1, «Bob»)
Метод size() позволяет узнать количество объектов в коллекции.
Проверку на наличие элемента в коллекции производится с помощью метода contains . А удаление с помощью метода remove . И так же, как и с добавлением, мы можем удалить либо конкретный элемент people.remove(«Tom»); , либо элемент по индексу people.remove(0); — удаление первого элемента.
Получить определенный элемент по индексу мы можем с помощью метода get() : String person = people.get(1); , а установить элемент по индексу с помощью метода set : people.set(1, «Robert»);
С помощью метода toArray() мы можем преобразовать список в массив объектов.
И поскольку класс ArrayList реализует интерфейс Iterable, то мы можем пробежаться по списку в цикле аля for-each: for(String person : people) .
Хотя мы можем свободно добавлять в объект ArrayList дополнительные объекты, в отличие от массива, однако в реальности ArrayList использует для хранения объектов опять же массив. По умолчанию данный массив предназначен для 10 объектов. Если в процессе программы добавляется гораздо больше, то создается новый массив, который может вместить в себя все количество. Подобные перераспределения памяти уменьшают производительность. Поэтому если мы точно знаем, что у нас список не будет содержать больше определенного количества элементов, например, 25, то мы можем сразу же явным образом установить это количество, либо в конструкторе: ArrayList people = new ArrayList(25); , либо с помощью метода ensureCapacity : people.ensureCapacity(25);
Разница между типом List и ArrayList в Java
При создании коллекций в Java часто возникает вопрос — какой тип использовать для объявления: интерфейс List или конкретный класс ArrayList. Например:
List<String> myList = new ArrayList<String>(); //первый вариант ArrayList<String> myList = new ArrayList<String>(); //второй вариант
Оба этих варианта корректны, но они имеют некоторые различия в использовании.
Использование интерфейса List
Использование интерфейса List для объявления коллекции предоставляет большую гибкость. В любой момент можно легко заменить используемую реализацию коллекции на другую, например, на LinkedList, не изменяя тип переменной. Это особенно полезно, когда реализация коллекции выбирается в зависимости от некоторых условий или может меняться в процессе работы приложения.
List<String> myList = new LinkedList<String>(); //без проблем заменили ArrayList на LinkedList
Использование класса ArrayList
Использование конкретного класса ArrayList для объявления коллекции ограничивает ее реализацию этим конкретным классом. В данном случае, замена на другую реализацию потребует изменения типа переменной.
ArrayList<String> myList = new LinkedList<String>(); //ошибка компиляции
Но при этом класс ArrayList может содержать дополнительные методы, которых нет в интерфейсе List. И если эти методы необходимы в коде, то выбор падает на второй вариант.
Заключение
В большинстве случаев рекомендуется использовать интерфейс List для объявления коллекции, так как это предоставляет больше гибкости и возможностей для изменения кода в будущем. Однако, если используются специфические методы класса ArrayList, то он выбирается в качестве типа переменной.
Java Blog
1. Размер: массив в Java имеет фиксированный размер. Мы не можем изменить размер массива после его создания. ArrayList имеет динамический размер. Когда мы добавляем элементы в ArrayList, его емкость увеличивается автоматически.
2. Производительность: в Java Array и ArrayList дают разную производительность для разных операций.
add() или get(): добавление или извлечение элемента из массива или объекта ArrayList имеет аналогичную производительность. Это операции с постоянным временем.
resize(): автоматическое изменение размера ArrayList снижает производительность. ArrayList внутренне поддерживается массивом. В resize() временный массив используется для копирования элементов из старого массива в новый массив.
3. Примитивы: массив может содержать как примитивные типы данных, так и объекты. Но ArrayList не может содержать примитивные типы данных. Он содержит только объекты.
4. Итератор: в ArrayList мы используем объект Iterator для обхода элементов. Мы используем цикл for для перебора элементов в массиве.
5. Безопасность типов: Java помогает обеспечить безопасность типов элементов в ArrayList с помощью дженериков. Массив может содержать объекты одного типа класса. Если мы пытаемся сохранить объект другого типа данных в массиве, он генерирует исключение ArrayStoreException.
6. Длина: размер ArrayList можно получить с помощью метода size(). Каждый массив имеет переменную length, которая совпадает с длиной/размером массива.
7. Добавление элементов: в ArrayList мы можем использовать метод add() для добавления объектов. В массиве используется оператор присваивания для добавления элементов.
8. Многомерность: массив может быть многомерным. ArrayList всегда одномерный.
Пример различий между массивами и ArrayList
import java.util.ArrayList; import java.util.Arrays; class Test < public static void main(String args[]) < // Обычный массив int[] arr = new int[2]; arr[0] = 100; arr[1] = 200; System.out.println(arr[0]); // ArrayList // Создаем ArrayList с начальной емкостью 2 ArrayListarrayList = new ArrayList(2); // Добавляем элементы в ArrayList arrayList.add(300); arrayList.add(400); // Доступ к элементам ArrayList System.out.println(arrayList.get(0)); > >
100 300
- Сборщики мусора в Java
- Модель памяти Java (JMM, Java Memory Model)
- Как работает JVM