Саволҳо дар ин мақола:
Масъалаҳои умумӣ- Маҷмӯаҳо дар 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 синфҳо ба монанди
Vector
ва вуҷуд доштандHashTable
, аммо чаҳорчӯба вуҷуд надоштCollection
. Пас аз он тасмим гирифта шуд, ки дастгирии сохторҳои маълумоти такрорӣ илова карда шавад. Ин чаҳорчӯба асосан аз ҷониби Ҷошуа Блок таҳия шудааст ва бори аввал дар JDK 1.2 пайдо шудааст.Мо метавонем бартариҳои асосиро номбар кунем:
- Вақти сарфи навиштани codeро кам мекунад
- Фаъолиятро тавассути истифодаи алгоритмҳои хеле самаранок ва сохторҳои додаҳо беҳтар мекунад
- Коллексияҳо як роҳи универсалии нигоҳдорӣ ва интиқоли маълумот мебошанд, ки ҳамкории қисмҳои гуногуни codeро осон мекунад
- Омӯзиш осон аст, зеро танҳо интерфейсҳои олӣ ва амалиёти дастгирӣшавандаро омӯхтан лозим аст
-
Дар бораи иерархияи коллексияҳо ба мо бигӯед?
Тавре ки дар расм нишон дода шудааст, чаҳорчӯбаи коллексияҳо дорои як интерфейси сатҳи боло мебошад -
Collection
, ки аз онSet
,List
ва мерос гирифта шудаандQueue
. Дар зер мо ба бисёр синфҳои дигар, ки дар ин се фorал мавҷуданд, дида мебароем. Унвони интерфейсро дар хотир доредCollection
, он ба шумо дар бисёр саволҳо кӯмак хоҳад кард.public interface Collection extends Iterable { //описание методов }
Чаҳорчӯба инчунин интерфейси Map-ро дар бар мегирад , ки насли
Collection
. Мо сабаби мерос нагирифтани уроCollection
дар саволи чорум дида мебароем. -
Чаро коллексияҳо интерфейсҳо
Cloneable
ваSerializable
.Хуб, ҷавоби соддатарин ин аст "зеро ин лозим нест." Функсияҳо тавассути интерфейсҳо таъмин карда мешаванд
Cloneable
ваSerializable
танҳо барои коллексияҳо лозим нестанд.Сабаби дигар ин аст, ки зеркласс на ҳамеша лозим аст
Cloneable
, зеро ҳар як амалиёти клонкунӣ хотираи зиёдро сарф мекунад ва барномасозони бетаҷриба метавонанд оқибатҳои онро дарк накарда, онро беҳуда сарф кунанд.Ва сабаби охирин он аст, ки клонкунӣ ва сериализатсия амалиёти хеле мушаххас мебошанд ва онҳо бояд танҳо дар ҳолати зарурӣ амалӣ карда шаванд. Бисёре аз синфҳои коллексия ин интерфейсҳоро амалӣ мекунанд, аммо барои татбиқи онҳо барои ҳама коллексияҳо комилан лозим нест. Агар ба шумо клонкунӣ ва сериализатсия лозим бошад, танҳо он синфҳоро истифода баред, агар не, синфҳои боқимондаро истифода баред.
-
Чаро
Map
интерфейс интерфейсро мерос намегирадCollection
?Ҷавоби хуб ба ин савол ин аст, ки "зеро онҳо номувофиқанд". Интерфейс
Collection
усулро тавсиф мекунадadd(Object o)
.Луғатҳо ин усулро дар бар гирифта наметавонанд, зеро онҳо бо ҷуфтҳои калид/арзиш кор мекунанд. Инчунин, луғатҳо намояндагӣ доранд
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