Резюме коллекции Java [вопросы для интервью + карта мозга], чтобы уловить все точки знаний!

Java задняя часть исходный код Java EE

предисловие

Утверждение, в этой статье используется jdk1.8

Потребовалась неделя, чтобы поставить Java-контейнеросновные знанияПосле одного прохода кажется, что у коллекции нет страха! ! (Хахаха....), давайте подведем итог~~

Просмотрите оглавление:

Контейнеры Java можно разделить на две категории:

  • Collection
    • List
      • ArrayList
      • LinkedList
      • Вектор (понять, устарел)
    • Set
      • HashSet
        • LinkedHashSet
      • TreeSet
  • Map
    • HashMap
      • LinkedHashMap
    • TreeMap
    • ConcurrentHashMap
    • Hashtable (понятно, устарело)

Выделенные - это мынаиболее используемыйконтейнер.

На самом деле, я не знаю, как обобщить это, потому что я обобщал это, когда писал каждую статью раньше. Перечислять их все сейчас кажется немного сомнительным, поэтому я решил ответить на несколько вопросов из интервью о Java-контейнерах!

Конечно, мой ответ может быть неверным. Если есть какие-либо ошибки, пожалуйста, укажите их много, и я надеюсь, что вы, не колеблясь, оставите сообщение в области комментариев, чтобы исправить их~~

Во-первых, разница между ArrayList и Vector

Общая основа:

  • Оба этих класса реализуют интерфейс List, и ониаккуратныйколлекция (хранится заказано),Нижний слой представляет собой массив. Мы можем получить элемент по его индексу позиции,Разрешить элементам повторяться и быть нулевыми.

разница:

  • Синхронизация:
    • ArrayList является асинхронным
    • Вектор синхронный
    • Даже когда требуется синхронизация, мы можем использовать служебный класс Collections для создания синхронизированного ArrayList вместо Vector.
  • Размер расширения:
    • Vector удваивает исходный размер, ArrayList увеличивается в 0,5 раза по сравнению с исходным размером

Во-вторых, разница между HashMap и Hashtable

Общая основа:

  • С точки зрения структуры хранения и реализации они в основном одинаковы, и все они реализуют интерфейс Map~

разница:

  • Синхронизация:
  • Разрешить ли null:
    • HashMap допускает нулевое значение
    • Hashtable не допускает null
  • содержит метод
    • Этот пункт знаний был отмечен на Niuke.com. Я не ожидал, что такой вопрос может существовать (мне это не очень нравится). …
    • Hashtable содержит метод
    • HashMap удалил метод contains из Hashtable и изменил его на containsValue и containsKey.
  • Наследование бывает разным:
    • HashMap<K,V> extends AbstractMap<K,V>
    • public class Hashtable<K,V> extends Dictionary<K,V>

3. Разница между списком и картой

Общая основа:

  • Все они являются обычно используемыми контейнерами в Java, и все они являются интерфейсами (пс: писать это похоже на то же самое, что и не писать...)

разница:

  • различные конструкции хранения:
    • Список — это коллекция, в которой хранится один столбец
    • Карта хранит коллекцию пар ключ-значение
  • Является ли элемент повторяемым:
    • Список позволяет повторять элементы
    • Карта не позволяет дублировать ключи
  • это в порядке:
    • Коллекция списков упорядочена (хранится по порядку)
    • Коллекция карт неупорядочена (хранилище неупорядочено)

В-четвертых, элементы в наборе не могут повторяться, так какой же метод используется для определения того, повторяется он или нет, использовать == или equals()?

Мы знаем, что коллекция Set на самом делеБольшинство из них используют метод put коллекции Map для добавления элементов..

Взяв в качестве примера HashSet, элементы в HashSet не могут повторяться, что отражено в исходном коде (HashMap) следующим образом:

	
	// 1. 如果key 相等  
    if (p.hash == hash &&
        ((k = p.key) == key || (key != null && key.equals(k))))
        e = p;
	// 2. 修改对应的value
	   if (e != null) { // existing mapping for key
            V oldValue = e.value;
            if (!onlyIfAbsent || oldValue == null)
                e.value = value;
            afterNodeAccess(e);
            return oldValue;
       }

При добавлении элементов, если ключ (также соответствующий элемент коллекции Set) равен, измените значение. В коллекции Set значение value — это просто объект Object (Объект бесполезен для самого Сета).

То есть: если элементы, добавленные в коллекцию Set, одинаковы,вообще не вставляется (изменяется только бесполезное значение)! Это также видно из исходного кода (HashMap),Оба метода == и equals() используются!

Пять, разница между коллекцией и коллекциями

  1. Коллекция выше коллекцииинтерфейс, который наследует интерфейсы Set и List
  2. Коллекции есть коллекцииИнструменты, который предоставляет ряд статических методов для поиска, поиска, синхронизации и других операций над коллекцией.

В-шестых, скажем, производительность хранилища и характеристики ArrayList, LinkedList

Нижний слой ArrayList — это массив, а нижний слой LinkedList — двусвязный список.

  • ArrayList поддерживает индексирование соответствующих элементов по угловой позиции (произвольный доступ), в то время как LinkedList необходимо пройти весь связанный список, чтобы получить соответствующие элементы. следовательноВообще говоря, скорость доступа ArrayList выше, чем у LinkedList.
  • Поскольку ArrayList представляет собой массив, потребление для удаления и изменения относительно велико (реализуется копированием и перемещением массивов). LinkedList — это двусвязный список. Для удаления и изменения требуется только изменить соответствующий указатель, а потребление очень мало. следовательноВообще говоря, скорость добавления и удаления LinkedList выше, чем у ArrayList.

6.1 Расширения:

Добавление и удаление ArrayListне обязательноПросто медленнее, чем LinkedList.

  • Если добавление и удаление вконецДля работы [remove() и add() вызываются каждый раз], ArrayList не нужно перемещать и копировать массив для работы. Если объем данных исчисляется миллионами,Скорость будет быстрее, чем LinkedList. (я тестировал)
  • еслиудалить операциюрасположен всередина. Поскольку использование LinkedList в основном связано с обходом, использование ArrayList в основном связано с перемещением и копированием (нижний уровень вызывает метод arraycopy(), который является собственным методом).
    • Скорость обхода LinkedList ниже, чем скорость перемещения копии ArrayList.
    • Если объем данных исчисляется миллионами,Или ArrayList быстрее. (я тестировал)

Семь, разница между интерфейсами Enumeration и Iterator

Я не рассказывал о них подробно в предыдущей статье, но я просто знаю, что: Iterator заменяет Enumeration, а Enumeration — это старый итератор.

По сравнению с Enumeration Iterator более безопасен,Поскольку во время обхода коллекции он не позволяет другим потокам изменять коллекцию..

  • Когда мы делаем упражнения, будут ли частые ошибки во время итерации, генерирующие исключения ConcurrentModificationException, говорящие о том, что мы все еще модифицируем элементы при обходе.
  • На самом деле это отказоустойчивый механизм~ Подробнее см. в сообщении блога:blog.CSDN.net/Пан Вэйвэй 19…

Есть три отличия:

  • Название метода Iterator более научно, чем Enumeration.
  • Итератор имеет отказоустойчивый механизм, который более безопасен, чем Enumeration.
  • Итератор может удалять элементы, перечисление не может удалять элементы

Восемь, каковы характеристики ListIterator

  • ListIteratorнаследоватьИнтерфейс итератора, который используется дляПеребор элементов коллекции List.
  • ListIterator может реализоватьДвусторонний обход, добавление элементов, установка элементов

Взгляните на метод исходного кода, чтобы знать:

9. Что такое параллельный класс сбора?

Параллельный пакет Java1.5 (java.util.concurrent)Содержит потокобезопасные классы коллекций, которые позволяют изменять коллекцию во время итерации..

  • Итераторы коллекций в пакете Utils рассчитаны на отказоустойчивость и выдают исключение ConcurrentModificationException. Но java.util.concurrent не будет, спасибо за напоминание в комментариях~
  • Некоторые из классов:
    • CopyOnWriteArrayList
    • ConcurrentHashMap
    • CopyOnWriteArraySet

10. Если значением ключа HashMap в Java является объект класса, каким условиям должен соответствовать класс?

Вам необходимо переопределить как метод hashCode() этого класса, так и его метод equals().

  • Как видно из исходного кода, при вставке элемента происходитСначала вычислите hashCode объекта. Если хэш-код равен. Затем это указывает, что объект хранится в том же месте.
  • Если вызывается метод equals(),Оба ключа одинаковы,нозаменить элемент
  • Если вызывается метод equals(),Два ключа не одинаковы, это означает, чтоhashCode просто оказывается таким же, в это время происходит коллизия хэшей, и вновь добавленный элемент помещается в корзину

В общем, мы бы рассмотрели:Два объекта считаются равными до тех пор, пока равны значения их переменных-членов! Потому что нижний слой Object сравнивает адреса двух объектов, и это не имеет особого смысла для нашей разработки~ Вот почему мы должны переписатьequals()метод

Если вы переопределяете метод equals(), вам необходимо переопределить метод hashCode(). так какequals() определяет, что два объекта одинаковыКогда тот же объект вызывает метод hashCode(), должно возвращать одно и то же значение!

11. Каковы лучшие практики, связанные с Java Collections Framework

  1. основываться на потребностяхОпределяет тип коллекции. Если это коллекция из одного столбца, мы рассматриваем возможность использования подинтерфейсов ArrayList и Set в разделе Коллекция. Если это карта, мы рассматриваем возможность использования Map~
  2. После определения типа нашей коллекции мы затемОпределяет, какой подкласс типа коллекции использовать~ Я думаю, что это можно легко разделить на несколько шагов:
    • Нужно ли синхронизировать
      • Найдите потокобезопасный класс коллекции для использования
    • Нужно ли его упорядочивать при итерации (порядок размещения упорядочивается)
      • Найдите структуру связанного двустороннего списка
    • Требуется ли сортировка (естественный порядок или ручная сортировка)
      • Перейти к типу дерева "Красно-черное дерево" (JDK1.8)
  3. Оценивая объем данных, хранящихся в коллекции, будь то список или карта, они достигают динамического роста, который все требует производительности. Датьразумная мощностьЭто уменьшит потребление динамического роста ~
  4. Используйте дженерики, чтобы избежать ClassCastException во время выполнения
  5. По возможности используйте служебный класс Collections или получите доступную только для чтения, синхронизированную или пустую коллекцию,вместо написания собственной реализации. Это обеспечит повторное использование кода, у него будет лучшая стабильность и ремонтопригодность.

12. Как повысить эффективность при добавлении 10 000 штук данных в коллекцию ArrayList

Начальная емкость ArrayList по умолчанию равна 10. Когда необходимо вставить большой объем данных, емкость необходимо постоянно увеличивать, и увеличение емкости сильно повлияет на производительность. Итак, теперь, когда 100 000 фрагментов данных ясны, мы можемУстановите емкость ArrayList непосредственно при инициализации!

Это повысит эффективность~

13. Резюме

В 17:14:03 15 апреля 2018 года я нашел несколько вопросов интервью и ответил на них, но мне показалось, что этого недостаточно. Я не нашел соответствующих вопросов для интервью по многим пунктам знаний, которые я считаю более важными (может быть, мои поисковые способности слишком слабы?).

Я воспринял эту статью как резюме сборника, но чувствовал, что писать нечего, поэтому пошел отвечать на некоторые вопросы интервью.Посмотрев некоторое время на вопросы интервью, я почувствовал, что это недостаточно систематично. И это резюме я не хочу копировать сюда резюме предыдущих глав.Поэтому я решил нарисовать ментальную карту, чтобы закончить этот пост.!

15 апреля 2018 19:31:33 Готов рисунок! ! ! ! !

Студенты, которым нужно больше карт мозга, могут обратить внимание на публичный номер: Java3y, просто ответьте на [карту мозга]~

img

Проект с открытым исходным кодом, охватывающий все точки знаний о бэкэнде Java (уже 6 тысяч звезд):GitHub.com/Zhongf UC очень…

если ты хочешьв реальном времениЕсли вы обратите внимание на мои обновленные статьи и галантерейные товары, которыми я делюсь, поищите в WeChat.Java3y.

Содержимое PDF-документоввсе вручную, если вы ничего не понимаете, вы можете напрямуюспросите меня(В официальном аккаунте есть мои контактные данные).