Я часто сталкивался с такими вопросами во время интервью в прошлом. Увы, мне стыдно, фонд слишком беден, я не чувствую себя обиженным
Теперь мы должны поговорить о различиях и соединениях между этими тремя: эти три реализуют интерфейс списка, все имеют методы, определенные в интерфейсе списка, а также имеют методы интерфейса сбора;
ArrayList: использует метод массива для хранения данных, запроса и скорости модификации, но скорость добавления и удаления медленная;
LinkedList: использует метод связанного списка для хранения данных, скорость запроса и модификации медленная, но скорость добавления и удаления быстрая.
Vector: он также использует массивы для хранения. Итераторы, перечисления, get (int index) и indexof (int index), но ArrayList не имеет перечислений
ArrayList и Vector используют массивы для хранения данных. Операции, индексные данные быстро вставлены, данные медленны. Или обратное обход, но только этот элемент требуется при вставке данных.
Линейные таблицы, связанные списки и хэш -таблицы обычно используют структуры данных. Все эти классы в пакете java.util. Эта статья пытается объяснить читателям роль каждого класса и как правильно их использовать с помощью простого описания.
Коллекция ├List │ ├linkedList │ ├ArrayList │ └Vector │ └Stack └SetMap ├hashtable ├hashmap └weakhashmap
Интерфейс коллекции
Коллекция является самым основным интерфейсом коллекции. Некоторые коллекции позволяют одни и те же элементы, а другие нет. Некоторые могут сортировать, но другие не могут. Java SDK не предоставляет классы, которые непосредственно унаследованы от коллекции.
Все классы, которые реализуют интерфейс сбора, должны предоставить два стандартных конструктора: для создания новой коллекции используется конструктор без параметра, и введенный конструктор сбора используется конструктор параметров сбора. тот же элемент. Последний конструктор позволяет пользователю копировать коллекцию.
Как итерации по каждому элементу в коллекции? Независимо от фактического типа коллекции, он поддерживает метод итератора (), который возвращает итератор и использует этот итератор для доступа к каждому элементу в коллекции один за другим. Типичные использования следующие:
Iterator it = collection.iterator ();
Два интерфейса, полученные из интерфейса коллекции, являются списком и установлены.
Список интерфейса
Список - это упорядоченная коллекция, и использование этого интерфейса позволяет точно управлять положением каждой вставки элемента. Пользователи могут использовать индексы (позиция элементов в списке, аналогичные подпискам на массивы) для доступа к элементам в списке, что аналогично массивам Java.
В отличие от набора, упомянутого ниже, список позволяет одни и те же элементы.
В дополнение к методу итератора (), который имеет необходимый интерфейс сбора, список также предоставляет метод ListIterator (), который возвращает интерфейс ListIterator Interface по сравнению с стандартным интерфейсом итератора, 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, представляет собой тот же интерфейс, что и итератор, созданный ArrayList, поскольку вектор синхронизируется, когда один итератор создается и используется, другой поток меняет состояние вектора (например, добавление добавления, добавление добавления, добавление добавления. или удаление некоторых) в настоящее время, coundrentModificationException будет выброшено при вызвании метода итератора, поэтому необходимо поймать исключение.
Стекк класс
Степкий наследство от вектора, внедряя стек Last-In First Out. Stack предоставляет 5 дополнительных методов, позволяющих использовать вектор в качестве стека. Основные методы Push и POP, и метод PEEK получают элементы в верхней части стека, пустой метод проверяет, является ли стек пустой, а метод поиска обнаруживает положение элемента в стеке. Стек просто создан и является пустым стеком.
Установить интерфейс
SET - это коллекция, которая не содержит дублирующих элементов, то есть в любых двух элементах E1 и E2 имеют e1.equals (e2) = false, а SET имеет не более одного нулевого элемента.
Очевидно, что конструктор SET имеет ограничение, и падающий параметр сбора не может содержать дублирующих элементов.
Обратите внимание: изменяемые объекты должны работать с осторожностью. Если измененный элемент в наборе меняет свое собственное состояние, вызывая object.equals (Object) = true, чтобы вызвать некоторые проблемы.
Карта интерфейс
Обратите внимание, что MAP не наследует интерфейс сбора, а MAP обеспечивает отображение от ключа к значению. Карта не может содержать одинаковую клавишу, и каждая клавиша может отображать только одно значение. Интерфейс карты предоставляет три типа видов коллекции.
Хэштерный класс
Hashtable наследует интерфейс карты и реализует хэш-таблицу с помощью картирования клавиш. Любой не нулевой объект может использоваться в качестве ключа или значения.
Используйте (ключ, значение), чтобы добавить данные, используйте (ключ) для извлечения данных.
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 и Equals Methips Унаследованы от объекта класса корневого класса. = true, тогда их хэшкод должен быть одинаковым, но если эти два объекта разные, их хешкоды не могут быть разными. Операционные хэш -таблицы, чтобы увеличить.
Если у одного и того же объекта есть разные хэшкоды, операция на хэш -таблице будет иметь неожиданные результаты (ожидаемый метод получения возврата NULL). Чтобы избежать этой проблемы, вам нужно помнить только одну вещь: вы должны переписать метод Equals и HashCode в соответствии со в то же время.
Хэштабл синхронизирован.
Hashmap Class
HashMap похож на хэштату, разница в том, что HashMap является асинхронным и допускает нулевое, то есть нулевое значение и нулевой ключ. , но когда HASHMAP считается методом сбора (The Value () может вернуть коллекцию), его итеративное время субоперирования пропорционально способности HashMap. Следовательно, если производительность итерационных операций очень важна, не устанавливайте инициализацию HashMap слишком высокой или коэффициент нагрузки слишком низок.
Sleedhashmap Class
SleedHashmap - это улучшенный хэшмап, который реализует «слабый ссылку» на ключ.
Суммировать
Если Stack, Queue и другие операции задействованы, вам следует рассмотреть возможность использования списка.
Если программа находится в однопользованной среде или доступ только в одном потоке, учитывая асинхронные классы, она более эффективна.
Обратите особое внимание на работу хэш -таблиц.
Попробуйте вернуть интерфейс вместо фактического типа, например, возврат списка вместо ArrayList. Это для абстрактного программирования.
Синхронизация
Вектор синхронно. Некоторые методы в этом классе гарантируют, что объекты в векторе защищены потоком. ArrayList является асинхронным, поэтому объекты в ArrayList не являются потоковыми. Поскольку требования к синхронизации будут влиять на эффективность выполнения, использование ArrayList является хорошим выбором, если вам не нужны сборы, защищенные потоком, что может избежать ненужных накладных расходов на производительность из-за синхронизации.
Рост данных
Из механизма внутренней реализации ArrayList и Vector используют массивы (массив) для управления объектами в сборе. Когда вы добавляете элементы в эти два типа, если количество элементов превышает текущую длину внутреннего массива, им необходимо расширить длину внутреннего массива Оригинальные 50% этого, поэтому в последний раз, когда вы получаете эту коллекцию, всегда займет больше места, чем вам действительно нужно. Поэтому, если вы хотите сохранить много данных в сборе, то есть некоторые преимущества для использования вектора, потому что вы можете избежать ненужных накладных расходов ресурсов, установив размер инициализации коллекции.
Режим использования
В Arraylist и Vector требуется то же время, чтобы найти данные из указанного местоположения (через индекс) или добавить и удалить элемент в конце набора. Однако, если элементы добавляются или удаляются в другом месте в наборе, потраченное время будет расти линейно: O (ni), где n представляет количество элементов в наборе, и я представляет позицию индекса, где элементы увеличивают или удаляют элементы. Почему это происходит? Считается, что при выполнении вышеуказанных операций все элементы после элементов I-TH и I-TH в наборе должны выполнять операции смещения. Что все это значит?
Это означает, что вы просто ищете элементы в определенном положении или просто добавляете и удаляете элементы в конце коллекции, затем использование Vector или ArrayList в порядке. Если это еще одна операция, вам лучше выбрать еще один класс операций по сбору. Например, время, необходимое для класса сбора Linklist, чтобы добавить или удалять элементы в любой позиции в коллекции, такое же? Это расположение индекса. Linklist также создаст объекты для каждого вставленного элемента, и все, что вам нужно для понимания, также принесет дополнительные накладные расходы.
Наконец, в книге «Практическая ява» Питер Хаггар предлагает использовать простой массив (массив) вместо вектора или массива. Это особенно верно для программ с высокой эффективностью выполнения. Поскольку использование массивов (массив) избегает синхронизации, дополнительные вызовы метода и ненужное перераспределение космических операций.