- Русские Блоги
- 1 Сравнение и обзор эпизодов структуры и массива
- 2 эпизода фреймворк -интерфейса
- 1. Дерево наследования интерфейса сбора
- 2. Дерево наследования интерфейса карты
- 2 эпизода прохождения
- 1.Terator Итератор прошел через коллекцию
- 3 эпизода прохождения
- 1. RRAYLIST Исходный код
- 2. Исходный код LinkedList
- 3. Исходный код вектора
Русские Блоги
С одной стороны, объектно-ориентированные языки отражают вещи в форме объектов. Чтобы облегчить работу с несколькими объектами, объекты должны храниться. С другой стороны, использование массивов Array для хранения объектов имеет некоторые недостатки, а коллекции Java похожи на контейнер, который может динамически помещать ссылки на несколько объектов в контейнер.
Характеристики массивов в оперативной памяти:
После инициализации массива определяется длина; Тип объявления массива определяет тип инициализации элемента
Недостатки массивов при хранении данных:
После инициализации массива длина неизменяема, что неудобно для расширения; В массиве предусмотрено несколько атрибутов и методов, что неудобно для таких операций, как добавление, удаление и вставка, а эффективность невысока; Невозможно напрямую получить количество элементов памяти; Данные, хранящиеся в массиве, упорядочены и воспроизводимы. ----> Отдельные характеристики хранимых данных
Классы коллекций Java могут использоваться для хранения нескольких объектов с разными числами, а также могут использоваться для хранения ассоциативных массивов с отношениями отображения.
2. Коллективная система
Коллекции Java можно разделить наCollection с участием Map Две системы
Интерфейс коллекции: данные в одном столбце, определяет набор методов для доступа к группе объектов Список: упорядоченный и повторяемый набор элементов Набор: неупорядоченный, неповторимый набор элементов. Интерфейс карты: данные в двух столбцах, клавиша сохранения отношения сопоставления-набор пар значений
3. Дерево наследования интерфейса коллекции
4. Сопоставьте дерево наследования интерфейса.
5. Определение интерфейса коллекции
public interface CollectionE> extends iterableE>
Из определения интерфейса видно, что этот интерфейс использует общее определение и (должен) указывать конкретный тип операции при работе. Это может обеспечить безопасность операции набора классов и избежать возникновения ClassCastException.
ВДо Java 5, Коллекции Java потеряют типы данных всех объектов в контейнере и будут рассматривать все объекты какТип объектаИметь дело сJDK 5.0 добавляет дженерикиВ будущем коллекции Java могут запоминать типы данных объектов в контейнере.
Коллекция — это самый простой интерфейс коллекции, Коллекция представляет собой группу Объектов, элементов Коллекции.
Все классы, реализующие интерфейс Collection, должны предоставлять два стандартных конструктора:
1. Конструктор без параметров используется для создания пустой Коллекции; 2. Конструктор с параметром Collection используется для создания новой коллекции, которая имеет те же элементы, что и традиционная коллекция. Этот конструктор позволяет пользователю копировать коллекцию.
6. Интерфейс итератора
6.1. Обход элементов коллекции с помощью интерфейса Iterator
Объект Iterator называется итератором (шаблоном проектирования), и он в основном используется для обхода элементов в коллекции.
GOF определяет шаблон итератора как: Предоставляет метод для доступа к каждому элементу в объекте-контейнере без раскрытия внутренних деталей объекта. Шаблон итератора создан для контейнеров.
Интерфейс Collection наследует интерфейс java.lang.Iterable, который имеет метод iterator (), поэтому все классы коллекции, реализующие интерфейс Collection, имеют метод iterator () для возврата объекта, реализующего интерфейс Iterator.
Итератор используется только для обхода коллекции, сам итератор не предоставляет возможности удерживать объекты.Если вам нужно создать объект Iterator, должна существовать итерация коллекции. Объект коллекции получает новый объект-итератор каждый раз, когда вызывает метод iterator (), а курсор по умолчанию находится перед первым элементом коллекции.
6.2. Методы интерфейса Iterator
6.3. Принцип выполнения итераторов
// hasNext (): определяем, есть ли другой элемент while(iterator.hasNext()) // next (): ①Перемещение указателя вниз ②Возврат элемента в позицию коллекции после перемещения вниз System.out.println(iterator.next()); >
Перед вызовом метода it.next () необходимо вызвать it.hasNext () для обнаружения. Если он не вызывается и следующая запись недействительна, прямой вызов it.next () вызовет исключение NoSuchElementException.
6.4. Метод remove () интерфейса итератора
Iterator iter = coll.iterator();// Вернуться к началу while(iter.hasNext()) Object obj = iter.next(); if(obj.equals("Tom")) iter.remove(); >
нота:
Итератор может удалять элементы коллекции, но это делается с помощью метода remove объекта итератора во время процесса обхода, а не метода удаления объекта коллекции.
Если next () не был вызван или метод удаления был вызван после последнего вызова следующего метода, любой вызов для удаления будет сообщать об исключении IllegalStateException.
7. Интерфейс карты
Карта и Коллекция существуют бок о бок.Используется для сохранения данных с помощью отношения сопоставления: пара «ключ-значение»
И ключ, и значение на карте могут быть данными любого ссылочного типа.
Ключи на карте хранятся в Set, Дублирование не допускается, то есть класс, соответствующий одному и тому же объекту Map, должен переопределять методы hashCode () и equals ().
Между ключом и значением существует односторонняя однозначная связь., То есть по указанному ключу всегда можно найти уникальное и определенное значение.
Общие классы реализации интерфейса карты: HashMap, TreeMap, LinkedHashMap и Properties. среди них, HashMap — наиболее часто используемый класс реализации интерфейса Map.
Источник
1 Сравнение и обзор эпизодов структуры и массива
1. Сбор и данные являются структурой работы нескольких данных, называемых контейнером Java.
(В настоящее время хранилище в основном относится к хранилищу на уровне памяти, которое не включает в себя постоянное хранилище (.txt, база данных и т. Д.)
2. Характеристики массива при хранении нескольких данных
- После инициализации длина определяется
- После определения определения тип его элемента определяется
3. Недостатки хранения массива
- После инициализации массива длина не может быть изменена
- Метод, предоставленный массивом, очень ограничен. Он очень неудобен для таких операций, как добавление, удаление и модификация, и эффективность не высока
- Особенности хранилища данных: упорядоченный, перечитанный. Это не может быть удовлетворен для беспорядочного спроса.
2 эпизода фреймворк -интерфейса
1. Дерево наследования интерфейса сбора
Список: упорядочен, повторяется
Установить: беспорядочно, не повторяется
2. Дерево наследования интерфейса карты
2 эпизода прохождения
1.Terator Итератор прошел через коллекцию
@Test public void test3() Collection c = new ArrayListInteger>(); c.add(1); c.add(2); Iterator iterator = c.iterator(); while (iterator.hasNext()) // Плохое движение вниз System.out.println(iterator.next()); if(iterator.next().equals(10)) // Удалить элемент iterator.remove(); > > >
3 эпизода прохождения
1. RRAYLIST Исходный код
- После JDK1.8 он не создается в конструкторе для создания 10 массива, а для создания метода добавления впервые. (Объект ArrayList в JDK7 создает голодный стиль Хана, похожий на один случай, а объект ArrayList в JDK1.8 создает ленивый стиль, похожий на один случай, который задерживает создание массива и сохраняет память).).)
- Если массив ElementData, который приводит к недостаточным уровням, емкость будет расширена.
- По умолчанию расширение емкости в 1,5 раза превышает исходную емкость, а оригинальный массив скопирован в новый массив
- Если вы, вероятно, знаете способность ArrayList, используйте конструктор Public ArrayList (int initycapacity), чтобы избежать частого расширения емкости
package com.ll; import java.util.Arrays; public class ArrayListE> // длина по умолчанию массива составляет 10 private static final int DEFAULT_CAPACITY = 10; // Контейнер представляет собой массив объекта [] типа transient Object[] elementData; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = >; private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; protected transient int modCount = 0; private int size; public ArrayList(int initialCapacity) if (initialCapacity > 0) this.elementData = new Object[initialCapacity]; > else if (initialCapacity == 0) this.elementData = EMPTY_ELEMENTDATA; > else throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); > > public ArrayList() // нет массива с длиной 10, defaultcapacity_empty_elementdata = <> this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; > // Если емкость массива elementData, которая вызывает базовый слой на этот раз недостаточно, емкость будет расширена. // По умолчанию расширение емкости в 1,5 раза превышает исходную емкость. В то же время оригинальный массив скопирован в новый массив // Если вы, вероятно, знаете способность ArrayList, используйте метод конструктора PublicList (int initycapacity), чтобы избежать частого расширения расширения емкости public boolean add(E e) ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; > // определить внутреннюю емкость private void ensureCapacityInternal(int minCapacity) ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); > private void ensureExplicitCapacity(int minCapacity) modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); > private static int calculateCapacity(Object[] elementData, int minCapacity) if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) return Math.max(DEFAULT_CAPACITY, minCapacity); > return minCapacity; > private void grow(int minCapacity) // overflow-conscious code int oldCapacity = elementData.length; // по умолчанию емкость в 1,5 раза превышает емкость исходной емкости int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // скопировать оригинальный массив в новое массив одновременно elementData = Arrays.copyOf(elementData, newCapacity); > private static int hugeCapacity(int minCapacity) if (minCapacity 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; > >
2. Исходный код LinkedList
public class LinkedListE> private static class NodeE> E item; NodeE> next; NodeE> prev; Node(NodeE> prev, E element, NodeE> next) this.item = element; this.next = next; this.prev = prev; > > transient NodeE> first; transient NodeE> last; private void linkFirst(E e) final NodeE> f = first; final NodeE> newNode = new NodeE>(null, e, f); first = newNode; if (f == null) last = newNode; else f.prev = newNode; size++; modCount++; > >
3. Исходный код вектора
Методы, модифицированные с помощью синхронизации
public synchronized void addElement(E obj) modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = obj; >
Источник