Источник статьи: Интернет Автор: PaleSting/CSDN
В этой статье мы рассмотрим типы данных в Java, но представим концепцию абстрактных типов данных (ADT). Мы также узнаем о некоторых ADT, определенных в Java, познакомившись с Java Collections Framework.
АДТ
ADT определяется только типом данных, который он содержит, и операциями, которые могут выполняться с этим типом данных. Разработчики могут получить доступ к свойствам ADT только через методы работы ADT, и они не будут знать, как реализованы различные операции внутри этого типа данных.
В Java мы часто используем интерфейс для предоставления набора операций, не раскрывая деталей реализации этих операций. Помните, что интерфейс определяет набор методов, и класс Java должен реализовать этот набор, чтобы удовлетворить свои обязательные условия или реализовать экземпляр интерфейса.
Линейные таблицы, стеки и очереди
Когда мы говорим об ADT, мы часто говорим о линейных списках, стеках и очередях. Мы не будем обсуждать детали этих структур данных, но обсудим, почему их называют ADT.
Линейный список — это набор конечных элементов, расположенных линейно и обеспечивающих прямой доступ к его элементам. Стек представляет собой упорядоченный линейный список по принципу «последним пришел — первым вышел» (LIFO). Элементы добавляются в начало стека и удаляются из него. Очередь представляет собой упорядоченный линейный список в порядке очереди, элементы добавляются из конца очереди и берутся из ее начала.
Внутренние структуры линейных списков, стеков и очередей могут быть реализованы разными способами. Например, мы могли бы использовать упорядоченный массив или связанный список для реализации каждой структуры. Ключевым моментом является то, что независимо от того, как вы реализуете его внутреннюю структуру, его внешний интерфейс всегда останется прежним. Это позволяет вам изменять или обновлять базовую реализацию без изменения общедоступного интерфейса.
Архитектура коллекции Java
Пакет разработки программного обеспечения Java 2 (SDK) предоставляет новые классы для поддержки наиболее часто используемых ADT. Эти классы называются классами коллекций Java (аналогично классам коллекций в MFC), и вместе они формируют архитектуру коллекций Java. Эта архитектура коллекции предоставляет набор интерфейсов и классов, которые представляют данные как так называемые абстрактные данные коллекции.
Интерфейс java.util.Collection используется для представления любой группы объектов, то есть элементов. Этот интерфейс обеспечивает основные операции, такие как добавление, удаление и запрос. Интерфейс Collection также предоставляет метод итератора. Метод итератора возвращает экземпляр интерфейса java.util.Iterator. Интерфейс Iterator предоставляет методы hasNext, next и delete. Используя методы, предоставляемые интерфейсом Iterator, вы можете просмотреть экземпляры объекта Collection от начала до конца и безопасно удалить элемент, представленный итератором (курсором).
java.util.AbstractCollection является основой для всех классов архитектуры коллекций. Класс AbstractCollection предоставляет реализации всех методов интерфейса java.util.Collection, кроме методов итератора и размера. Эти два метода исключений реализованы всеми подклассами, наследующими java.util.AbstractCollection.
Класс, реализующий интерфейс, должен обеспечивать реализацию всех методов интерфейса. Поскольку некоторые методы интерфейса в архитектуре коллекции являются необязательными, должен быть способ уведомить вызывающую сторону о том, что определенный метод не реализован. Если реализован необязательный метод, а этот метод не реализован, создается исключение UnsupportedOperationException. Класс UnsupportedOperationException наследует класс RuntimeException. Это позволяет вызывающей стороне вызывать все операции сбора, не помещая каждый вызов в пару try-catch.
Список линейной таблицы
Интерфейс List наследует интерфейс Collection и определяет упорядоченную коллекцию, которая позволяет существовать идентичным элементам. Интерфейс List также добавляет методы, которые используют числовое значение индекса для работы с элементами в коллекции на основе положения элемента в линейном списке. Эти операции включают добавление, получение, установку и удаление.
Интерфейс List также предоставляет метод listIterator. Этот метод возвращает экземпляр интерфейса java.util.ListIterator, который позволяет вам перемещаться по линейному списку от начала до конца или от конца до конца. java.util.ListIterator наследует интерфейс java.util.Iterator. Таким образом, он поддерживает добавление и изменение элементов в коллекции, которую он представляет.
В следующем примере показано, как перемещаться по элементам списка сзади вперед. Для этого ListIterator должен быть расположен после последнего элемента списка перед началом обхода.
ListIterator iter = aList.listIterator(aList.size());
пока (iter.hasPrevious())
System.out.println(iter.previous().toString());
}
Архитектура коллекции предоставляет две реализации интерфейса List: LinkedList (связанный список) и ArrayList (список-массив, то есть статический список). Обе реализации поддерживают произвольный доступ к своим элементам. Экземпляр ArrayList поддерживает операции в стиле массива и поддерживает операции изменения размера массива. Экземпляр LinkedList обеспечивает явную поддержку добавления, удаления и предоставления элементов в начале и конце списка. Используя эти новые методы, программист может просто использовать LinedList в качестве стека или очереди следующим образом:
LinkedList aQueue = новый LinkedList(aCollection);
aQueue.addFirst(newElement);
Объект anElement = aQueue.removeLast();
LinkedList aStack = новый LinkedList(aCollection);
aStack.addFirst(newElement);
Объект anElement= aStack.removeFirst();
Фрагмент кода в таблице A демонстрирует некоторые распространенные операции над экземплярами реализации интерфейса java.util.List с использованием java.util.ArrayList и java.util.LinkedList. Эти операции включают добавление элементов, произвольный доступ к элементам и явное удаление элементов из конца списка.
Знать, что происходит, и не знать, почему, очень полезно.
ADT предоставляет мощный инструмент для отделения операций в общедоступном интерфейсе объекта от его конкретной реализации. Это позволяет реализации ADT изменяться и развиваться, сохраняя при этом ее открытый интерфейс неизменным. Архитектура коллекций Java предоставляет большое количество интерфейсов и реализаций, которые представляют коллекции базовых элементов и могут использоваться для создания полезных ADT.