Как сделать коллекцию java

Обновлено: 05.07.2024

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

Спасибо,вроде как "Лед тронулся",коллекции использовать нельзя,проблему с массивом я решил так: -обьявил в классе массив типа Object(без инициализации) в методе add сделал переменную String куда добавляю через пробел все данные,и потом через split(" ")добавляю все в массив. Скажите,это нормальное решение?

Ну, это решение, но, конечно, это больше костыль, не универсально, короче плохо. Не надо исользовать коллекции, можно использовать просто c-style массивы, их ява и использует по факту. Если и их нельзя использовать, то нужно реализовывать такую вещь как linked list. Тут каждый элемент хранит ссылку на предыдущий и последующий, а личт хранит ссылку на конец и начало. Но это сложнее и думаю, что от тебя ождают именно реализацию типа ArrayList

4 ответа 4

Основные методы и логика масштабирования внутреннего массива в обе стороны:


Для начала, прочитайте про Обобщения(Generics) в Java - это нужно для того, чтобы понять, как сделать коллекцию для любого типа.

Позже, на основании массива (ведь ArrayList и реализован на основе массива) сделайте динамическое расширение массива при достижении максимальной длины. Делается это в двух словах так:

  1. Проверяете при добавлении не последний ли это элемент в массиве?
  2. Если true -> создаете новый массив с бОльшим размером, чем в текущем, копируете содержимое текущего массива, а затем подменяете ссылки на массивы.

Таким же образом можно создавать динамически расширяемые стэки, очереди, etc.

Если нужны коллекции не на основе массива - смотрите в сторону LinkList или Tree, в интернете есть масса статей, как сделать свою коллекцию на основании LinkList или Tree.

Java 9 предоставляет новый способ создания read-only коллекций при помощи стандартных универсальных методов List.of(), Set.of() и Map.of().

Например, если мы хотим создать список строк, представляющих собой дни недели, то он будет выглядеть так:

List days = List.of(
"понедельник" ,
"вторник" ,
"среда" ,
"четверг" ,
"пятница" ,
"суббота" ,
"воскресенье" );

При этом при попытке модифицировать полученную коллекцию (например, добавить новый элемент) вы получите ошибку, т.к. в данном случае вы работаете с неизменямой коллекцией.

Теперь рассмотрим работы с мапой. Метод Map.of() принимает чётное количество элементов, где каждый нечётный - это ключ коллекции, а каждый чётный - значение. Для предыдущего примера вариант с мапой будет выглядеть так:

Map days = Map.of(
1 , "понедельник" ,
2 , "вторник" ,
3 , "среда" ,
4 , "четверг" ,
5 , "пятница" ,
6 , "суббота" ,
7 , "воскресенье" );

Данная коллекция опять-таки является неизменяемой. Но есть и ещё один нюанс. Здесь вы можете объявить не более 10 элементов мапы. Если вы захотите объявить 11 и более элементов, компилятор выдаст ошибку.

Java Коллекции являются одним из столпов Java Core. Они используются почти в каждом приложении, поэтому мы просто обязаны уметь использовать Java Collections Framework эффективно.

Что такое Коллекции?

Коллекции — это контейнеры, группы элементов, которые представляют собой единое целое.

Например: банка конфет, список имен и т.д. Коллекции используются почти в каждом языке программирования и Java не является исключением. Как только коллекции появились в Java, то насчитывали всего несколько классов: Vector, Stack, Hashtable, Array. Но уже в Java 1.2 появился полноценный Java Collections Framework, с которым мы и будем сегодня знакомиться.

Коллекции в Java состоят нескольких частей

  • Интерфейсы: В коллекциях интерфейсы обеспечивают абстрактный тип данных для представления коллекции java.util.Collection — корневого интерфейса фреймворка. Он находится на вершине иерархии Коллекций. Он содержит наиболее важные методы: size() , iterator() , add() , remove() , clear() . Каждая коллекция должна реализовывать эти методы. Также есть другие важные интерфейсы java.util.List, java.util.Set,java.util.Queue и java.util.Map . Map является единственным интерфейсом, который не наследует интерфейс Collection , но является неотъемлемой частью коллекций. Все интерфейсы фреймворка находятся в пакете java.util .
  • Реализация: Java предоставляет готовые классы с реализацией вышеупомянутых коллекций. Мы можем использовать их для создания новых типов коллекций в нашей программе. С помощью классов ArrayList, LinkedList, HashMap, TreeMap, HashSet, TreeSet можно решить огромное количество задач, но если нам нужна специальная реализация той или иной коллекции, мы можем наследовать её и работать со своей реализацией. В Java 1.5 придумали потокобезопасные коллекции, которые позволили изменять содержимое коллекции время итерации по элементам. Наиболее популярными являются: CopyOnWriteArrayList, ConcurrentHashMap, CopyOnWriteArraySet. Эти классы находятся в пакете java.util.concurrent . Все классы коллекций находятся в пакетах java.util и java.util.concurrent .
  • Алгоритмы: алгоритмы — это полезны методы, которые решают тривиальные задачи, например: поиск, сортировка и перетасовка элементов коллекции.
  • Ниже на диаграмме классов показана иерархия Java Collections Framework. Для простоты я включил только часто используемые интерфейсы и классы.

Преимущества Java Collections Framework

В Java Collections Framework есть следующие преимущества:

  • Требует меньше усилий. Фреймворк располагает множеством распространенных типов коллекций и полезных методов для манипуляции данными. Таким образом, мы можем сосредоточиться на бизнес-логике, а не разработке наших API.
  • Отличное качество — использование хорошо проверенных коллекций увеличивает качество нашей программы.
  • Повторное использование и совместимость

Интерфейсы коллекций

Интерфейсы являются основой Java Collections Framework. Обратите внимание, что все интерфейсы являются Generic, например public interface Collection . Использование — это указание типа объекта, который коллекция может содержать. Это помогает сократить ошибки времени выполнения с помощью проверки типов объектов во время компиляции.

Следует отметить, что платформа Java не предоставляет отдельные интерфейсы для каждого типа коллекций. Если какая-то операция не поддерживается, то реализация коллекции бросает UnsupportedOperationException.

Кратко по каждой коллекции

Интерфейс итератора (Iterator)

Итератор предоставляет методы для перебора элементов любой коллекции. Мы можем получить экземпляр итератора из коллекции с помощью метода iterator . Итераторы позволяют удалить элементы из базовой коллекции во время выполнения итерации.

Интерфейс множества (Set)

Набор представляет собой коллекцию, которая не может содержать повторяющиеся элементы. Этот интерфейс представляет математическую абстракцию для представления множеств в виде колоды карт.

Платформа Java содержит три реализации Set : HashSet, TreeSet и LinkedHashSet.И нтерфейс Set не позволяет осуществлять произвольный доступ к элементу в коллекции. Мы можем использовать итератор или цикл по каждому элементу для перебора элементов.

Интерфейс Список (List)

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

Эта статья является первой из серии статей о коллекциях в Java. В будущих статьях будет рассмотрены основные классы-коллекции, появившиеся в Java 1.5. Будут рассмотрены классы, унаследованные от Set, List, Queue и Map: ArrayList, HashSet, EnumSet, LinkedHashSet, LinkedList, PriorityQueue, TreeSet, HashMap, LinkedHashMap, TreeMap и другие.

Немного истории

До появления версии 1.5 в Java были только 3 типа коллекций: массивы, Vector (и унаследованный от него Stack) и Hashtable.

До Java 1.4 включительно Vector представлял собой очередь, в которую можно было добавлять объект любого класса. Он представлял простой способ работы с цепочкой элементов. Так как типизированные коллекции появились только в 5-й версии Java, то программисты нередко использовали Vector для хранения объектов разных классов из-за простоты использования. Конечно, и в 5-й версии Java, можно создать любую коллекцию, которая будет хранить объекты класса java.lang.Object, но это делать строго не рекоммендуется. В Java 1.5 Vector стал типизированным как и остальные классы коллекций.

Hashtable - коллекция, позволяющая хранить данные в виде ключ-значение. Иногда Hashtable сравнивают (и приравнивают) с ассоциативными массивами из других языков программирования. Ключ и значение могут быть любым объектом, но не примитивом. Также, ключ в Hashtable не может быть null.

До Java 1.4 в Vector и Hashtable нельзя было добавлять примитивные типы, такие как: int, float, long, double. Для создания списка примитивных объектов необходимо было использовать оболочки для примитивных типов: Integer, Float, Long, Double. С выходом Java версии 1.5, в Vector и Hashtable можно добавлять примитивные типы. Они будут автоматически преобразованы в свои обертки.

Vector и Hashtable были и остаются синхронизированными из-за чего операции с ними занимают больше времени, чем с аналогичными классами List и Map. Vector и Hashtable - устаревшие классы, которые не рекоммендуется использовать.

Коллекции в Java 1.5

Перейдем непосредственно к коллекциям, которые появились в Java 1.5. Все коллекции унаследованы от одного интерфейса Collection из пакета java.util. Интерфейс Collection, в свою очередь, реализует интерфейс Iterable. Это означает, что все классы, унаследованные от Collection могут использоваться в цикле foreach. Например так:

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

Иерархия интерфейсов, унаследованных от Collection представлена на Рис.1. Как можно заметить, отсутствует интерфейс Map - он не унаследован от Collection и о нём разговор будет отдельный.

Рис 1. Collections в Java


Рис 1. Коллекции (Collections) в Java

Стоит заметить, что в Java нет ни одного класса, который напрямую реализует интерфейс Collection. Это происходит через промежуточные интерфейсы List, Set и Queue.

Общепринятые правила использования Collection

1. Всегда корректно описывайте методы equals() и hashCode() в объектах, которые будут добавлены в коллекцию. Например, для того, чтобы метод contains(Object o) вернул корректное значение, необходимо чтобы выполнялось следующее условие: (o==null ? e==null : o.equals(e)). Метод hashCode() гарантирует, что два объекта с разными значениями hashCode() не могут быть равны. Также метод hashCode() может использоваться коллекцией для наиболее эффективного размещения объектов в памяти. Это правило не касается стандартных типов вроде String, Integer, Float и т.д. так как в этих классах уже реализованы оба метода.

2. Каждый класс, реализующий интерфейс Collection, имеет как минимум два конструктора: конструктор по умолчанию и конструктор, принимающий коллекцию (объект Collection ). Это правило ложиться на плечи разработчика так как у интерфейсов не может быть конструкторов. Пример:

3. Класс реализует интерфейс Collection и если метод не поддерживается коллекцией, то необходимо генерировать исключение UnsupportedOperationException. Это является необязательным правилом. Например, если коллекция не может быть модифицирована, то при вызове метода add() может произойти исключение UnsupportedOperationException, а может и не произойти если это не критично.

Читайте также: