이 기사의 질문:
일반적인 문제- Java의 컬렉션이란 무엇입니까? 장점을 나열해 보세요
- 컬렉션 계층 구조에 대해 알려주세요.
Cloneable
컬렉션이 인터페이스 와 를 상속하지 않는 이유는 무엇입니까Serializable
?Map
인터페이스가 인터페이스를 상속하지 않는 이유는 무엇입니까Collection
?
- 우리는 왜 목록을 사용합니까? 인터페이스를 구현하는 주요 클래스는 무엇입니까
List
? - 문자열 배열을 로 변환하는 방법은 무엇입니까
ArrayList
? - 목록을 역순으로 정렬하는 방법은 무엇입니까?
- 세트를 사용하는 이유는 무엇입니까? 인터페이스를 구현하는 주요 클래스는 무엇입니까
Set
? - 요소는 어떻게 저장됩니까
HashSet
? - 요소를 또는
null
에 추가할 수 있습니까 ?TreeSet
HashSet
- 우리는 왜 사전을 사용하는가? 인터페이스를 구현하는 주요 클래스는 무엇입니까
Map
? IdentityHashMap
은( 는) 무엇 입니까WeakHashMap
?- 이것이 무엇인지 설명해주세요
ConcurrentHashMap
. 어떻게 작동하나요? - 사전은 어떻게 작동하나요?
- 좋은 사전 키를 만드는 방법은 무엇입니까?
- 인터페이스는 어떤 콘텐츠 보기를 제공합니까
Map
? - 언제 사용해야 하며
HashMap
언제 사용해야 합니까TreeMap
?
Set
이들그리고 의 차이점은 무엇인가요List
?List
이들그리고 의 차이점은 무엇인가요Map
?HashMap
와 의 차이점을 말해 보세요.HashTable?
Vector
이들그리고 의 차이점은 무엇인가요ArrayList
?Iterator
이들그리고 의 차이점은 무엇인가요Enumeration
?HashMap
이들그리고 의 차이점은 무엇인가요HashSet
?Iterator
이들그리고 의 차이점은 무엇인가요ListIterator
?TreeSet
이들그리고 의 차이점은 무엇인가요SortedSet
?ArrayList
이들그리고 의 차이점은 무엇인가요LinkedList
?
- 컬렉션을 읽기 전용으로 만드는 방법은 무엇입니까?
- 스레드로부터 안전한 컬렉션을 만드는 방법은 무엇입니까?
Iterator.add()
컬렉션에 요소를 추가하는 방법이 없는 이유는 무엇입니까 ?- 목록의 요소를 반복하는 방법에는 어떤 것이 있나요?
- 반복자 속성이 작동한다는 것을 어떻게 이해합니까
fail-fast
? fail-fast
이들그리고 의 차이점은 무엇인가요fail-safe
?ConcurrentModificationException
컬렉션을 반복하는 동안 피하는 방법은 무엇입니까 ?- 무슨 일이 일어났나요
UnsupportedOperationException
? - 어떤 컬렉션 클래스가 모든 요소에 대한 액세스를 제공합니까?
- 무슨 일이 일어났나요
BlockingQueue
? - 큐와 스택이 무엇인지, 차이점을 나열해 보세요.
Comparable
인터페이스 와 란 무엇입니까Comparator
?Collections
클래스 와 란 무엇입니까Arrays
?- 사용된 문헌 목록
일반적인 문제
-
Java의 컬렉션이란 무엇입니까? 장점을 나열 하시겠습니까?
По определению — коллекция это an object представляющий собой группу an objectов. Как в теории множеств — множество это группа an objectов. Просто, не так ли? До выхода JDK 1.2, существовали классы такие How
Vector
иHashTable
, но не было фреймворкаCollection
. Потом было решено добавить поддержку многократно используемых структур данных. Данный фреймворк был разработан преимущественно Джошуа Блохом, и впервые появился в JDK 1.2.В качестве главных преимуществ мы можем перечислить:
- Уменьшаются затраты времени на написание codeа
- Улучшается производительность, благодаря использованию высокоэффективных алгоритмов и структур данных
- Коллекции являются универсальным способом хранения и передачи данных, что упрощает взаимодействие разных частей codeа
- Простота в изучении, потому что необходимо выучить только самые верхние интерфейсы и поддерживаемые операции
-
Расскажите про иерархию коллекций?
Как показано на картинке, фреймворк коллекций содержит один интерфейс верхнего уровня —
Collection
, от которого наследуютсяSet
,List
иQueue
. Ниже мы рассмотрим еще множество классов, содержащихся в этих трех ветвях. Запомните заголовок интерфейсаCollection
, это поможет вам с многими вопросами.public interface Collection extends Iterable { //описание методов }
Также фреймворк содержит интерфейс Map, который не является наследником интерфейса
Collection
. Причину почему он не наследуетCollection
, мы разберем в четвертом вопросе. -
Почему коллекции не наследуют интерфейсы
Cloneable
иSerializable
?Ну, простейший ответ — "потому что не надо". Функционал предоставляемый интерфейсами
Cloneable
иSerializable
просто не нужен для коллекций.Еще одна причина — далеко не всегда нужен подкласс
Cloneable
потому что каждая операция клонирования потребляет очень много памяти, и неопытные программисты могут расходовать ее сами не понимая последствий.И последняя причина — клонирование и сериализация являются очень узкоспецифичными операциями, и реализовывать их нужно только когда это необходимо. Многие классы коллекции реализуют данные интерфейсы, но совершенно незачем закладывать их для всех коллекций вообще. Если вам нужно клонирование и сериализация - просто воспользуйтесь теми классами где она есть, если нет — остальными классами.
-
Почему интерфейс
Map
не наследует интерфейсCollection
?Хороший ответ на этот вопрос — "потому что они несовместимы". В интерфейсе
Collection
описан методadd(Object o)
.Словари не могут содержать этот метод, потому что работают с парами ключ/meaning. Также, словари имеют представления
keySet
,valueSet,
которых нет в коллекциях.В связи с этими различиями, интерфейс
Map
не может наследовать интерфейсCollection
, и представляет собой отдельную ветвь иерархии.
Вопросы про списки
-
Почему мы используем списки? Какие основные классы реализуют интерфейс
List
?Списки в Java это упорядоченная коллекция элементов. Каждый элемент имеет индекс, начинающийся с нуля. Все индексы уникальны. Кроме методов описанных в интерфейсе
Collection
, списки имеют свои собственные методы, в основном для работы с elementми коллекциями по их индексу. Можно разделить эти методы на 3 группы — поиск element, получение конкретного element, перебор коллекции и выборка подгруппы. Все эти операции могут производиться по индексу element.Основные классы, реализующие интерфейс
List
этоStack
,Vector
,ArrayList
иLinkedList
. За более подробной информацией по ним, обратитесь к documentации. -
Как преобразовать массив строк в
ArrayList
?Вопрос этот несколько глубже чем просто по программированию, How это видится новичкам. Цель его — проверить знание кандидатом служебных классов фреймворка
Collection
. Рассмотрим два таких класса, наиболее востребованных на собеседованиях —Collections
иArrays
.Класс
Collections
предоставляет статические методы для операций над коллекциями. СоответственноArrays
предоставляет статические методы для операций над массивами.String[] words = {"аз", "буки", "веди", "глагол", "добро"}; //Как вы можете обратить внимание, у нас есть массив строк String[] words. //В котором у нас лежат 5 строк. List wordList = Arrays.asList(words); //легким движением руки, а точнее вызовом Arrays.asList() мы превратor наш //массив строк в список List wordList.
Также хотелось бы отметить, что этот метод способен обрабатывать не только строки, он создаст список элементов любого типа, которого был массив.
Integer[] nums = {1, 2, 3, 4}; List numList = Arrays.asList(nums);
-
Как отсортировать список в обратном порядке?
Как и предыдущий, этот вопрос проверяет ваше знание служебных классов
Collection
List reversedList = Collections.reverse(list);
Вопросы про множества
-
Почему мы используем множества? Какие основные классы реализуют интерфейс
Set
?Он моделирует математическое множество, из теории множеств. Интерфейс
Set
похож наList
, но имеет некоторые отличия. Первое — это не упорядоченная коллекция. Следовательно, добавление/удаление элементов не требует их сортировки. Главная особенность множеств - уникальность элементов, то есть один и тот же элемент не может содержаться в множестве дважды.Очень важными для функционирования множеств являются методы
equals()
иhashCode()
, они позволяют сравнивать множества разных классов. Два множества являются идентичными только если они содержат одни и те же элементы.Как следует из вышеизложенного, множества не поддерживают операций основанных на индексе element, How списки. Множества имеют только те методы которые описаны в интерфейсе
Collection
Основными классами, реализующими интерфейс
Set
, являютсяEnumSet
,HashSet
,LinkedHashSet
иTreeSet
. Если хотите узнать больше — почитайте соответствующие разделы documentации Java. -
Как хранятся элементы в
HashSet
?Как вы уже в курсе,
HashMap
хранит пары ключ/meaning, и ключи должны быть уникальны.HashSet
использует эту особенностьHashMap
для обеспечения уникальности своих элементов. В классеHashSet
, словарь описан следующим образом:private transient HashMap<E, Object> map; private static final Object PRESENT = new Object();
Итак, когда вы сохраняете элемент в множестве, оно кладет данный элемент в качестве ключа в словарь, а meaningм идет an object PRESENT, How это описано ниже:
public boolean add(E e) { return map.put(e, PRESENT) == null; }
Я настоятельно рекомендую вам прочесть эту статью, это поможет вам с легкостью ответить на все связанные с
HashMap
вопросы. -
Может ли элемент
null
быть добавлен вTreeSet
orHashSet
?Как видно из предыдущего ответа, в методе
add()
нет проверки наnull
. Также,HashMap
позволяет один ключnull
, следовательно, один элементnull
может быть добавлен вHashSet
.TreeSet
работает по тому же принципу что иHashSet
, но используетNavigableMap
для хранения элементовprivate transient NavigableMap<E,Object> m; private static final Object PRESENT = new Object();
NavigableMap
это класс-наследникSortedMap
, аSortedMap
не позволяет использование ключейnull
. Следовательно, иTreeMap
не поддерживает хранение элементов типаnull
. Если вы попробуете добавитьnull в TreeSet
, получите исключениеNullPointerException
.
Вопросы про словари
-
Почему мы используем словари (
Map
)? Какие основные классы реализуют интерфейсMap
?Словари — специальный тип коллекции, которая используется для хранения пар ключ/meaning. По этой причине он не является наследником интерфейса
Collection
. Словарь предоставляет методы для добавления пар ключ/meaning, удаления, поиска и перебора по предоставляемым словарем представлениям данных.Основные классы реализующие интерфейс
Map
:HashMap
,Hashtable
,EnumMap
,IdentityHashMap
,LinkedHashMap
иProperties
. -
What такое
IdentityHashMap
иWeakHashMap
?IdentityHashMap
похож наHashMap
за одним исключением — для сравнения an objectов используется сравнение указателей на an objectы, если указатели не равны (указывают на an objectы лежащие по разным addressм), значит an objectы считаются различными.IdentityHashMap
является довольно редко используемым. Хотя он реализует интерфейсMap
, он нарушает один из основных принципов устройстваMap
, который требует использования методаequals()
для сравнения an objectов.IdentityHashMap
используется только в тех случаях, когда требуется сравнение an objectов по их addressм.WeakHashMap
это реализация интерфейсаMap
, которая содержит слабые ссылки на элементы. То есть, если за пределамиWeakHashMap
не осталось ни одной ссылки на его элемент, этот элемент удаляется сборщиком мусора. Класс предназначен для использования с an objectми, у которых методequals()
проверяет идентичность an objectов с помощью оператора==
. После того How элемент будет удален сборщиком мусора, он уже не может быть восстановлен, и к большому удивлению программиста найти его в словаре больше не получится. -
Объясните что такое
ConcurrentHashMap
? Как оно работает?Взято с официальной documentации:
Реализация словаря fully поддерживающая многопоточное добавление/удаление/поиск элементов. Данный класс следует тем же спецификациям что иHashtable
, и содержит методы соответствующие методамHashtable
. Однако, хотя все операции являются потокобезопасными, операция по выборке элементов не блокирует таблицу, и вообще нет возможности запретить весь доступ к таблице. Этот класс совместим сHashtable
во всем кроме вопросов многопоточной синхронизации. -
Как работает
hashmap
?Самый важный вопрос, который скорее всего будет задан на собеседовании программисту любого уровня. Вы должны хорошо разбираться в этой теме, и не только потому что это самый задаваемый вопрос, но и потому что понимание устройства
hashmap
позволяет вам легче разобраться в других особенностях работы коллекций.Ответ на этот вопрос очень обширный, и fully его можно прочесть в этой статье — How работает hashmap. А на данный момент просто запомните что
HashMap
работает на основе хэширования. Словарь, по определению, это an object который связывает ключи и значения. Для хранения таких структур, он использует внутренний классEntry
.static class Entry implements Map.Entry { final K key; V value; Entry next; final int hash; ...//Еще много codeа тут }
Переменные
key
иvalue
служат для хранения ключа и значения. А сами an objectыEntry
лежат в массиве./** * Размер таблицы меняется по необходимости, * и обязательно должен быть equals степени двойки */ transient Entry[] table;
Индекс нужного element в массиве вычисляется по хэш-codeу ключа. Больше информации можете получить по ссылке в начале ответа.
-
Как создать хороший ключ для словаря?
Следующий хороший вопрос, который обычно задают следом за вопросом о функционировании
HashMap
. Итак, главное ограничение — ключ должен быть таким, чтобы потом по нему можно было получить из словаря meaning. Иначе в его использовании просто нет смысла. Если вы понимаете How функционируетhashmap
, вы знаете что его работа сильно зависит от методовhashCode()
иequals()
an objectов-ключей.Как следует из вышеизложенного, хороший ключ должен давать один и тот же
hashCode
снова и снова, независимо от того сколько раз он запрашивается. А также, одинаковые ключи, при вызове методаequals()
должны возвращать true, а разные — false.Из чего следует, что лучшими кандидатами на роль ключа являются неизменяемые классы.
Можете почитать еще по addressу.
-
Какие представления содержимого предоставляет интерфейс
Map
?Интерфейс
Map
предоставляет три представления хранящихся данных:- множество всех ключей
- множество всех значений
- множество an objectов
Entry
, содержащих в себе и ключ и meaning
Перемещаться по ним можно с помощью итераторов.
-
Когда нужно использовать
HashMap
, а когдаTreeMap
?HashMap
это очень широко используемый класс, и вы это знаете. Так что, я ограничусь тем, что скажу что в нем хранятся пары ключ/meaning и он позволяет проводить над ними многие операции.TreeMap
이것은 특별한 품종입니다HashMap
. 차이점은 키가TreeMap
순서대로 저장된다는 것입니다. 기본값은 "자연 정렬"입니다. 키를 정렬하는 데 사용되는Comparator
메서드 인 클래스의 인스턴스를 제공하여 정렬을 재정의할 수 있습니다 .compare
사전에 추가된 모든 키는 인터페이스를 구현해야 합니다
Comparable
(정렬에 필요함). 또한 모든 키는 상호 호환되어야 합니다. 어떤 키도 호출k1.compareTo(k2)
해서는 안 되며 사전에 저장되어서도 안 됩니다. 사용자가 이 조건을 위반하는 사전에 키를 넣으려고 시도하는 경우(예: 모든 키 유형이 사전에 문자열 키인 경우 ) 메소드는 를 호출해야 합니다 .ClassCastException
k1
k2
Integer
put(Object key, Object value)
ClassCastException
GO TO FULL VERSION