В этом руководстве мы рассмотрим, как использовать Java Collection Framework для организации данных и работы с ними. В Collection Framework доступны различные типы интерфейсов коллекций и классы, которые их реализуют. Эти интерфейсы можно разделить на интерфейс Коллекция и интерфейс Карта. Мы можем создать упорядоченный объект коллекции или объект коллекции на основе индекса, используя Интерфейс коллекции. С другой стороны, мы можем создавать объекты коллекций с парой ключ-значение, используя интерфейсы карты.

Коллекция(I)

Интерфейс коллекции называется корневым интерфейсом Collection Framework. Этот интерфейс содержит несколько абстрактных методов общего назначения, и его дочерние классы или интерфейсы автоматически имеют доступ к этим методам. Важными методами являются следующие:

Интерфейс коллекции не имеет класса реализации. Интерфейсы List и Set расширяют интерфейс Collection.

Список(Я)

Интерфейс List Java Collection Framework хранит упорядоченную коллекцию элементов. Этот интерфейс содержит методы для добавления, удаления и доступа к элементам коллекции. Среди наиболее важных методов интерфейса List:

Порядок вставки сохраняется в списке. Это означает, что элементы будут сохранены в том порядке, в котором они были вставлены. Мы можем хранить в нем повторяющиеся элементы.

Поскольку List представляет собой абстрактный интерфейс, вы не можете создать экземпляр напрямую. Вместо этого вам необходимо создать экземпляр класса, реализующего интерфейс List. ArrayList, LinkedList и Vector — это некоторые классы, реализующие интерфейс List.

ArrayList

ArrayList — это класс в пакете java.util, реализующий интерфейс List. Он предлагает динамические массивы, которые можно расширять по мере необходимости. ArrayLists можно создавать с фиксированной емкостью, и их размер будет автоматически изменяться при достижении этой емкости. Мы можем вставлять в него разнородные объекты. Также возможна вставка значений NULL.

👉 Вот несколько конструкторов ArrayList:

👉 Вот код, показывающий, как использовать List и ArrayList:

Мы создали объект ArrayList и присвоили его List в предыдущем фрагменте кода. Мы можем это сделать, поскольку ArrayList — это класс реализации интерфейса List. Затем мы заполняем ArrayList некоторыми однородными элементами (типа String). В строке 13 мы используем метод toArray() для преобразования ArrayList в объект массива. Этот метод toArray() был унаследован ArrayList из интерфейса Collection. Затем значения массива печатаются с использованием индекса.

👉 Рассмотрим следующий фрагмент кода:

В данном случае мы добавили несколько разнородных объектов в ArrayList. Затем элементы ArrayList печатаются с помощью метода get(int index) и извлекают индекс существующего элемента с помощью метода indexOf(Object obj).

👉 Вот пример универсального типа ArrayList:

Мы создаем универсальный ArrayList типа String и заполняем его элементами String. В строке 12 мы вставляем двойной элемент; в строке 13 мы вставляем еще один двойной элемент, но на этот раз преобразуем его в строку. Если мы запустим этот код, мы получим ошибку времени компиляции с надписью «несовместимые типы: double невозможно преобразовать в String» для строки 12. К строке 13 претензий не будет. В результате, когда мы создаем универсальный ArrayList, мы не можем хранить в нем другие примитивные или пользовательские типы данных. Мы должны использовать универсальный тип для хранения других примитивных типов данных.

ArrayList также поддерживает интерфейс RandomAccess. Вот почему мы можем быстро получить значения из большого ArrayList из любой позиции.

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

Синхронизированный список массивов

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

В предыдущем коде мы создали несинхронизированный ArrayList с десятью элементами. Каждый элемент представляет собой место с соответствующим статусом. Затем мы используем метод Collections.synchronizedList() для создания синхронизированного ArrayList, который принимает ArrayList в качестве параметра и возвращает синхронизированную версию список.

Мы создали пару потоков, каждый со своим собственным классом SeatStatusModifier, который реализует интерфейс Runnable и переопределяет метод run(). У нас есть синхронизированный блок в методе run(). Объект ArrayList, в основном статус места, изменяется в синхронизированном блоке для обеспечения поточно-безопасного доступа, и измененные элементы списка печатаются. Поскольку список синхронизирован, несколько потоков могут безопасно изменять его, не вызывая несоответствий или ошибок.

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

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

Первоначально опубликовано на https://codenicetomedear.blogspot.com.