Линейные таблицы, связанные списки и хэш -таблицы являются обычно используемыми структурами данных. При разработке Java JDK предоставил нам ряд соответствующих классов для реализации основных структур данных. Все эти классы в пакете java.util. Эта статья пытается объяснить читателям роль каждого класса и как правильно их использовать с помощью простого описания.
Коллекция ├List │✜linkedList │✜arrayList │└Vector │└stack └set Map ├hashtable ├hashmap └weakhashmap
Интерфейс коллекции
Коллекция является самым основным интерфейсом коллекции. Коллекция представляет собой набор объектов, то есть элементы коллекции (элементы). Некоторые коллекции позволяют одни и те же элементы, а другие нет. Некоторые могут сортировать, но другие не могут. Java SDK не предоставляет классы, которые непосредственно унаследованы от коллекции. Классы, предоставленные Java SDK, представляют собой «Subinterfaces», которые унаследованы от коллекции, таких как список и установка.
Все классы, которые реализуют интерфейс сбора, должны предоставить два стандартных конструктора: конструктор без параметра используется для создания пустой коллекции, а конструктор параметров сбора используется для создания новой коллекции, которая имеет те же элементы, что и входящая коллекция. Последний конструктор позволяет пользователю копировать коллекцию.
Как итерации по каждому элементу в коллекции? Независимо от фактического типа коллекции, он поддерживает метод итератора (), который возвращает итератор и использует этот итератор для доступа к каждому элементу в коллекции один за другим.
Типичные использования следующие:
Итератор it = collection.iterator (); // Получить итератор while (it.hasnext ()) {Object obj = it.next (); // Получить следующий элемент} Два интерфейса, полученные из интерфейса коллекции, являются списком и установлены.
Список интерфейса
Список - это упорядоченная коллекция, и использование этого интерфейса позволяет точно управлять положением каждой вставки элемента. Пользователи могут использовать индексы (позиция элементов в списке, аналогичные подпискам на массивы) для доступа к элементам в списке, что аналогично массивам Java.
В отличие от набора, упомянутого ниже, список позволяет одни и те же элементы.
В дополнение к методу итератор (), который имеет необходимый метод итератора (), List также предоставляет метод ListIterator (), который возвращает интерфейс ListIterator. По сравнению со стандартным интерфейсом итератора, ListIterator имеет больше методов, таких как add (), позволяя добавить, удалять, устанавливать элементы и пересекать вперед или назад.
Общие классы, которые реализуют интерфейсы списка, включают LinkedList, ArrayList, Vector и Stack.
LinkedList Class
LinkedList реализует интерфейс списка, позволяя нулевым элементам. Кроме того, LinkedList обеспечивает дополнительные Get, удалить, вставить методы в заголовке или хвост LinkedList. Эти операции позволяют использовать LinkedList в качестве стека, очереди или двусторонней очереди.
Обратите внимание, что LinkedList не имеет синхронного метода. Если несколько потоков получают доступ к списку одновременно, вы должны реализовать синхронизацию доступа самостоятельно. Одним из решений является создание синхронного списка при его создании:
List List = collections.synchronizedlist (new LinkedList (...));
Arraylist Class
ArrayList реализует массивы размером с переменного размера. Это позволяет всем элементам, включая NULL. ArrayList не синхронизирован.
Время выполнения размера, Isempty, Get, установленные методы постоянны. Тем не менее, накладные расходы метода добавления представляют собой амортизированную постоянную, и для добавления N -элементов требуется время O (n). Другие методы имеют линейное время выполнения.
Каждый экземпляр ArrayList имеет емкость, которая представляет собой размер массива, используемого для хранения элементов. Эта емкость может автоматически увеличиваться, поскольку новые элементы постоянно добавляются, но алгоритм роста не определяется. Когда необходимо вставить большое количество элементов, метод EncureCapacity может быть вызван перед вставкой для увеличения емкости ArrayList для повышения эффективности вставки.
Как и LinkedList, ArrayList также несинхронизирован.
Векторный класс
Вектор очень похож на ArrayList, но вектор синхронно. Хотя итератор, созданный Vector, представляет собой тот же интерфейс, что и итератор, созданный ArrayList, поскольку вектор синхронизируется, когда один итератор создается и используется, другой поток изменяет состояние вектора (например, добавление или удаление некоторых элементов), будет запечатлено в исключении.
Стекк класс
Степкий наследство от вектора, внедряя стек Last-In First Out. Stack предоставляет 5 дополнительных методов, позволяющих использовать вектор в качестве стека. Основные методы Push и POP, и метод PEEK получают элементы в верхней части стека, пустой метод проверяет, является ли стек пустой, а метод поиска обнаруживает положение элемента в стеке. Стек просто создан и является пустым стеком.
Установить интерфейс
SET - это коллекция, которая не содержит дублирующих элементов, то есть в любых двух элементах E1 и E2 имеют e1.equals (e2) = false, а SET имеет не более одного нулевого элемента.
Очевидно, что конструктор SET имеет ограничение, и падающий параметр сбора не может содержать дублирующих элементов.
Обратите внимание: изменяемые объекты должны работать с осторожностью. Если измененный элемент в наборе меняет свое собственное состояние, он вызывает объект. Equals (Object) = true, чтобы вызвать некоторые проблемы.
Карта интерфейс
Обратите внимание, что MAP не наследует интерфейс сбора, а MAP обеспечивает отображение от ключа к значению. Карта не может содержать одинаковую клавишу, и каждая клавиша может отображать только одно значение. Интерфейс карты предоставляет три типа видов коллекции. Содержание карты можно рассматривать как набор коллекций ключей, набора коллекций значений или набора сопоставлений ключей.
Хэштерный класс
Hashtable реализует интерфейс карты для реализации хэш-таблицы с помощью картирования клавиш. Любой не нулевой объект может использоваться в качестве ключа или значения.
Используйте PUT (ключ, значение), чтобы добавить данные, используйте GET (ключ) для извлечения данных. Время накладных расходов этих двух основных операций является постоянным.
Hashtable корректирует производительность через начальные параметры емкости и коэффициента нагрузки. Обычно коэффициент загрузки по умолчанию 0,75 может лучше достичь времени и космического баланса. Увеличение коэффициента нагрузки может сэкономить пространство, но соответствующее время поиска увеличится, что повлияет на такие операции, как Get и Plat.
Простой пример использования хэштета заключается в следующем: Поместите 1, 2 и 3 в хэштику, а их ключи - «один», «два», «три» соответственно:
Hashtable Numbers = new Hashtable ();
numbers.put ("One", новое целое число (1));
numbers.put («два», новое целое число (2));
numbers.put ("three", новое целое число (3));
Чтобы взять число, например, 2, используйте соответствующий ключ:
Integer n = (Integer) numbers.get ("два");
System.out.println ("two =" + n);
Поскольку объект в качестве ключа будет определять положение соответствующего значения путем расчета его хэш -функции, любой объект в качестве ключа должен реализовать методы хэшкода и равные. HashCode и Equal Method, наследуя от объекта класса корневого класса. Если вы используете пользовательский класс в качестве ключа, будьте очень осторожны. Согласно определению функции хэш, если два объекта одинаковы, то есть obj1.equals (obj2) = true, их хэшкод должен быть одинаковым, но если два объекта разные, их хэшкоды не могут быть разными. Если хешкоды двух разных объектов одинаковы, это явление называется конфликтом. Конфликт увеличит время работы хэш -таблицы. Поэтому попробуйте определить метод HashCode (), чтобы ускорить работу хэш -таблицы.
Если один и тот же объект имеет разные хэшкоды, операция в таблице хэш будет иметь неожиданные результаты (ожидаемый метод получения возврата нулевой). Чтобы избежать этой проблемы, вам нужно вспомнить только одну вещь: вы должны переписать метод Equals и метод хэшкода одновременно, а не просто писать один из них.
Хэштабл синхронизирован.
Hashmap Class
HashMap похож на хэштату, разница в том, что HashMap является асинхронным и допускает нулевое, то есть нулевое значение и нулевой ключ. , но когда HASHMAP считается методом сбора (The Value () может вернуть коллекцию), его итеративное время субоперирования пропорционально способности HashMap. Следовательно, если производительность итерационных операций очень важна, не устанавливайте инициализацию HashMap слишком высокой или коэффициент нагрузки слишком низок.
Sleedhashmap Class
Sleedhashmap - это улучшенный хэшмап, который реализует «слабую ссылку» на ключ. Если ключ больше не ссылается извне, ключ может быть переработан GC.
Суммировать
Если участвуют стек, очередь и другие операции, вам следует рассмотреть возможность использования списка. Для элементов, которые должны быть быстро вставлены и удалены, вы должны использовать LinkedList. Если необходимо получить доступ к элементам, вам следует использовать ArrayList.
Java.util.collections Class Package
Класс java.util.collections содержит много полезных методов, которые могут облегчить работу программистов, но эти методы обычно не используются полностью. Javadoc дает наиболее полное описание класса коллекций: «Этот класс содержит выделенный статический класс, который может работать или вернуть коллекцию.
”1,2 Методы включены
Итератор, ArrayList, элементы, буфер, карта, коллекции
Лизи:
импортировать java.util.arraylist; Импорт java.util.collection; импортировать java.util.collections; Импорт java.util.comparator; импортировать java.util.list; Общедоступные классы Collectionssort {public collectionsSort () {} public static void main (string [] args) {двойной массив [] = {111, 111, 23, 456, 231}; Список списка = new ArrayList (); Список li = new ArrayList (); for (int i = 0; i <array.length; i ++) {list.add (new Double (Array [i])); //list.add("+райррей]); } двойной arr [] = {111}; for (int j = 0; j <arr.length; j ++) {li.add (новый двойной (arr [j])); }}2. Конкретные операции
1) Сортировать (сортировку)
Используйте метод сортировки, чтобы сортировать указанный список в порядке возрастания в соответствии с естественным порядком элементов. Все элементы в списке должны реализовать сопоставимый интерфейс. Все элементы в этом списке должны сравниваться друг с другом, используя указанный компаратор
двойной массив [] = {112, 111, 23, 456, 231}; for (int i = 0; i <array.length; i ++) {list.add (new Double (Array [i])); } Collections.sort (list); for (int i = 0; i <array.length; i ++) {System.out.println (li.get (i)); } // Результат: 112,111,23,456,2312) перетасовка
Алгоритм гибридного расположения делает точно противоположное: он нарушает любые перестановки, которые можно найти в списке. То есть список переставляется на основе ввода случайного источника, такое расположение имеет такую же возможность (при условии, что случайный источник справедливо). Этот алгоритм очень полезен для реализации игры удачи. Например, его можно использовать для смешивания списка объектов карт, представляющих колоду карт. Кроме того, это также очень полезно при создании тестовых случаев.
Collections.shuffling (список) двойной массив [] = {112, 111, 23, 456, 231}; for (int i = 0; i <array.length; i ++) {list.add (new Double (Array [i])); } Collections.shuffle (list); for (int i = 0; i <array.length; i ++) {System.out.println (li.get (i)); } // Результат: 112,111,23,456,2313) Обратный
Используйте обратный метод, чтобы сортировать указанный список в порядке убывания в соответствии с естественным порядком элементов.
Collections.Reverse (список) двойной массив [] = {112, 111, 23, 456, 231}; for (int i = 0; i <array.length; i ++) {list.add (new Double (Array [i])); } Коллекции. Обратный (список); for (int i = 0; i <array.length; i ++) {System.out.println (li.get (i)); } // Результат: 231,456,23,1111112 4) Замените все элементы в указанном списке на указанный элемент. String str [] = {"dd", "aa", "bb", "cc", "ee"}; for (int j = 0; j <str.length; j ++) {li.add (new String (str [j])); } Collections.fill (li, "aaa"); for (int i = 0; i <li.size (); i ++) {System.out.println ("list [" + i + "] =" + li.get (i)); } // Результат: AAA, AAA, AAA, AAA5) Копия (копия)
Используйте два параметра, целевой список и исходный список, чтобы скопировать исходный элемент в цель и перезаписать его содержимое. Список целей, по крайней мере, дольше, как и источник. Если это дольше, оставшиеся элементы в списке целей не затронуты.
Collections.copy (List, Li): последний параметр является целевым списком, предыдущий - это список источников
двойной массив [] = {112, 111, 23, 456, 231}; Список списка = new ArrayList (); Список li = new ArrayList (); for (int i = 0; i <array.length; i ++) {list.add (new Double (Array [i])); } двойной arr [] = {1131,333}; String str [] = {"dd", "aa", "bb", "cc", "ee"}; for (int j = 0; j <arr.length; j ++) {li.add (новый двойной (arr [j])); } Collections.copy (list, li); for (int i = 0; i <list.size (); i ++) {System.out.println ("list [" + i + "] =" + list.get (i)); } // Результат: 1131,333,23,456,2316) Возвращает самый маленький элемент в коллекциях (мин)
Возвращает наименьший элемент данной коллекции в соответствии с порядком, в котором генерируется указанный компаратор. Все элементы в сборе должны сравниваться друг с другом через указанный компаратор
Collections.min (список) двойной массив [] = {112, 111, 23, 456, 231}; Список списка = new ArrayList (); for (int i = 0; i <array.length; i ++) {list.add (new Double (Array [i])); } Collections.min (список); for (int i = 0; i <list.size (); i ++) {System.out.println ("list [" + i + "] =" + list.get (i)); } // Результат: 237) Возвращает самый маленький элемент (макс) в коллекциях
Возвращает максимальный элемент данного сбора в соответствии с порядком, в котором генерируется указанный компаратор. Все элементы в сборе должны сравниваться друг с другом через указанный компаратор
Collections.max (список) двойной массив [] = {112, 111, 23, 456, 231}; Список списка = new ArrayList (); for (int i = 0; i <array.length; i ++) {list.add (new Double (Array [i])); } Collections.max (list); for (int i = 0; i <list.size (); i ++) {System.out.println ("list [" + i + "] =" + list.get (i)); } // Результат: 4568) LastIndexofSublist
Возвращает исходную позицию указанного списка целей, который последний раз появлялся в указанном списке источников
int count = collections.lastindexofsublist (List, li); двойной массив [] = {112, 111, 23, 456, 231}; Список списка = new ArrayList (); Список li = new ArrayList (); for (int i = 0; i <array.length; i ++) {list.add (new Double (Array [i])); } двойной arr [] = {111}; String str [] = {"dd", "aa", "bb", "cc", "ee"}; for (int j = 0; j <arr.length; j ++) {li.add (новый двойной (arr [j])); } Int locations = коллекции. LastIndexOfSublist (список, LI); System.out.println ("==="+ локации); // результат 39) IndexOfSublist
Возвращает начальную позицию в первый раз, когда указанный целевой список появляется в указанном списке источников
int count = collections.indexofsublist (list, li); двойной массив [] = {112, 111, 23, 456, 231}; Список списка = new ArrayList (); Список li = new ArrayList (); for (int i = 0; i <array.length; i ++) {list.add (new Double (Array [i])); } двойной arr [] = {111}; String str [] = {"dd", "aa", "bb", "cc", "ee"}; for (int j = 0; j <arr.length; j ++) {li.add (новый двойной (arr [j])); } Int locations = collections.indexofsublist (list, li); System.out.println ("==="+ локации); // результат 110) Поверните
Циклически перемещать элементы в указанном списке на основе указанного расстояния
Collections.rotate (список, -1);
Если это отрицательное число, оно движется позитивно, и если оно движется позитивно, оно движется позитивно.
двойной массив [] = {112, 111, 23, 456, 231}; Список списка = new ArrayList (); for (int i = 0; i <array.length; i ++) {list.add (new Double (Array [i])); } Collections.rotate (список, -1); for (int i = 0; i <list.size (); i ++) {System.out.println ("list [" + i + "] =" + list.get (i)); } // Результат: 111,23,456,231,112В приведенной выше статье кратко обсуждается сборы классов реализации и карту обычно используемых структур данных в Java. Это весь контент, которым я поделился с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.