Domande in questo articolo:
Problemi generali- Cosa sono le raccolte in Java? Elenca i loro vantaggi
- Raccontaci della gerarchia delle collezioni
- Perché le raccolte non ereditano le interfacce
Cloneable
eSerializable
? - Perché
Map
l'interfaccia non eredita l'interfacciaCollection
?
- Perché usiamo le liste? Quali classi principali implementano l'interfaccia
List
? - Come convertire un array di stringhe in
ArrayList
? - Come ordinare un elenco in ordine inverso?
- Perché usiamo i set? Quali classi principali implementano l'interfaccia
Set
? - Come vengono memorizzati gli elementi in
HashSet
? null
È possibile aggiungere un elemento aTreeSet
oHashSet
?
- Perché usiamo i dizionari? Quali classi principali implementano l'interfaccia
Map
? - Cos'è
IdentityHashMap
eWeakHashMap
? - Spiegare di cosa si tratta
ConcurrentHashMap
? Come funziona? - Come funzionano i dizionari?
- Come creare una buona chiave del dizionario?
- Quali visualizzazioni dei contenuti fornisce l'interfaccia
Map
? - Quando dovresti usarlo
HashMap
e quando dovresti usarloTreeMap
?
- Quali sono le differenze tra
Set
eList
? - Quali sono le differenze tra
List
eMap
? - Nomina le differenze tra
HashMap
eHashTable?
- Quali sono le differenze tra
Vector
eArrayList
? - Quali sono le differenze tra
Iterator
eEnumeration
? - Quali sono le differenze tra
HashMap
eHashSet
? - Quali sono le differenze tra
Iterator
eListIterator
? - Quali sono le differenze tra
TreeSet
eSortedSet
? - Quali sono le differenze tra
ArrayList
eLinkedList
?
- Come rendere una raccolta di sola lettura?
- Come creare una raccolta thread-safe?
- Perché non esiste un metodo
Iterator.add()
per aggiungere elementi a una raccolta? - Quali modi ci sono per scorrere gli elementi di un elenco?
- Come si fa a capire che la proprietà iteratore funziona
fail-fast
? - Qual è la differenza tra
fail-fast
efail-safe
? - Come evitare
ConcurrentModificationException
durante l'iterazione di una raccolta? - Che è successo
UnsupportedOperationException
? - Quali classi di raccolta danno accesso a qualsiasi elemento?
- Che è successo
BlockingQueue
? - Cos'è una coda e uno stack, elenca le differenze tra loro?
- Cosa sono le interfacce
Comparable
eComparator
? - Cosa sono le classi
Collections
eArrays
? - Elenco della letteratura usata
Problemi generali
-
Cosa sono le raccolte in Java? Elencare i loro vantaggi?
Per definizione, una collezione è un oggetto che è un gruppo di oggetti. Come nella teoria degli insiemi, un insieme è un gruppo di oggetti. Semplice, no? Prima di JDK 1.2 esistevano classi come
Vector
eHashTable
, ma non esisteva alcun frameworkCollection
. Quindi si è deciso di aggiungere il supporto per strutture dati riutilizzabili. Questo framework è stato sviluppato principalmente da Joshua Bloch ed è apparso per la prima volta in JDK 1.2.Possiamo elencare i principali vantaggi:
- Riduce il tempo impiegato nella scrittura del codice
- Migliora le prestazioni attraverso l'uso di algoritmi e strutture dati altamente efficienti
- Le raccolte rappresentano un modo universale per archiviare e trasferire dati, che semplifica l'interazione di diverse parti del codice
- Facile da imparare perché è necessario apprendere solo le interfacce più importanti e le operazioni supportate
-
Ci parli della gerarchia delle collezioni?
Come mostrato nell'immagine, il framework delle raccolte contiene un'interfaccia di livello superiore -
Collection
, da cui vengono ereditatiSet
,List
eQueue
. Di seguito esamineremo molte altre classi contenute in questi tre rami. Ricorda il titolo dell'interfacciaCollection
, ti aiuterà con molte domande.public interface Collection extends Iterable { //описание методов }
Il framework contiene anche l'interfaccia Map , che non è una discendente di
Collection
. Vedremo il motivo per cui non ereditaCollection
nella quarta domanda. -
Perché le raccolte non ereditano le interfacce
Cloneable
eSerializable
?Ebbene, la risposta più semplice è “perché non è necessario”. La funzionalità è fornita dalle interfacce
Cloneable
eSerializable
semplicemente non è necessaria per le raccolte.Un altro motivo è che una sottoclasse non è sempre necessaria
Cloneable
perché ogni operazione di clonazione consuma molta memoria e i programmatori inesperti possono sprecarla senza comprenderne le conseguenze.E l’ultimo motivo è che la clonazione e la serializzazione sono operazioni molto specifiche e dovrebbero essere implementate solo quando necessario. Molte classi di raccolta implementano queste interfacce, ma non è assolutamente necessario implementarle per tutte le raccolte in generale. Se hai bisogno di clonazione e serializzazione, usa semplicemente le classi dove si trova, altrimenti usa le classi rimanenti.
-
Perché
Map
l'interfaccia non eredita l'interfacciaCollection
?Una buona risposta a questa domanda è “perché sono incompatibili”. L'interfaccia
Collection
descrive il metodoadd(Object o)
.I dizionari non possono contenere questo metodo perché funzionano con coppie chiave/valore. Inoltre, i dizionari hanno rappresentazioni
keySet
chevalueSet,
non si trovano nelle raccolte.A causa di queste differenze, un'interfaccia
Map
non può ereditare un'interfacciaCollection
ed è un ramo separato della gerarchia.
Domande sulle liste
-
Perché usiamo le liste? Quali classi principali implementano l'interfaccia
List
?Le liste in Java sono una raccolta ordinata di elementi. Ogni elemento ha un indice che parte da zero. Tutti gli indici sono unici. Oltre ai metodi descritti nell'interfaccia
Collection
, gli elenchi hanno i propri metodi, principalmente per lavorare con gli elementi della raccolta in base al loro indice. Puoi dividere questi metodi in 3 gruppi: cercare un elemento, ottenere un elemento specifico, scorrere una raccolta e selezionare un sottogruppo. Tutte queste operazioni possono essere eseguite dall'indice dell'elemento.Le classi principali che implementano l' interfaccia
List
sonoStack
,Vector
eArrayList
.LinkedList
Per informazioni più dettagliate su di essi, fare riferimento alla documentazione. -
Come convertire un array di stringhe in
ArrayList
?Questa domanda è un po' più profonda della semplice programmazione, come sembra ai principianti. Il suo scopo è testare la conoscenza del candidato delle classi di utilità del framework
Collection
. Consideriamo due di queste classi che sono più richieste durante le interviste:Collections
eArrays
.La classe
Collections
fornisce metodi statici per le operazioni sulle raccolte. Di conseguenza,Arrays
fornisce metodi statici per le operazioni sugli array.String[] words = {"аз", "буки", "веди", "глагол", "добро"}; //Как вы можете обратить внимание, у нас есть массив строк String[] words. //В котором у нас лежат 5 строк. List wordList = Arrays.asList(words); //легким движением руки, а точнее вызовом Arrays.asList() мы превратor наш //массив строк в список List wordList.
Vorrei anche notare che questo metodo è in grado di elaborare non solo stringhe, ma creerà un elenco di elementi di qualsiasi tipo fosse l'array.
Integer[] nums = {1, 2, 3, 4}; List numList = Arrays.asList(nums);
-
Come ordinare un elenco in ordine inverso?
Come la precedente, questa domanda mette alla prova la tua conoscenza delle classi di utilità.
Collection
List reversedList = Collections.reverse(list);
Domande sugli insiemi
-
Perché usiamo i set? Quali classi principali implementano l'interfaccia
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ов-ключей.Come segue da quanto sopra, una buona chiave dovrebbe dare
hashCode
sempre la stessa chiave, non importa quante volte venga richiesta. Inoltre, chiavi identicheequals()
dovrebbero restituire true quando si chiama un metodo e chiavi diverse dovrebbero restituire false.Da ciò ne consegue che i migliori candidati per il ruolo di chiave sono classi immutabili.
Puoi leggere di più su .
-
Quali visualizzazioni dei contenuti fornisce l'interfaccia
Map
?L'interfaccia
Map
fornisce tre visualizzazioni dei dati memorizzati:- set di tutte le chiavi
- insieme di tutti i valori
- un insieme di oggetti
Entry
contenenti sia una chiave che un valore
Puoi esplorarli utilizzando gli iteratori.
-
Quando dovresti usarlo
HashMap
e quando dovresti usarloTreeMap
?HashMap
questa è una classe molto utilizzata e tu lo sai. Quindi mi limiterò a dire che memorizza coppie chiave/valore e consente di eseguire molte operazioni su di esse.TreeMap
questa è una varietà specialeHashMap
. La differenza è che le chiaviTreeMap
sono conservate in modo ordinato. L'impostazione predefinita è "ordinamento naturale". È possibile sovrascrivere l'ordinamento fornendo un'istanza della classeComparator
, ilcompare
cui metodo verrà utilizzato per ordinare le chiavi.Tieni presente che tutte le chiavi aggiunte al dizionario devono implementare l'interfaccia
Comparable
(questo è necessario per l'ordinamento). Inoltre, tutte le chiavi devono essere reciprocamente compatibili:k1.compareTo(k2)
non devono richiamarneClassCastException
nessunak1
ek2
memorizzate nel dizionario. Se l'utente tenta di inserire una chiave nel dizionario che viola questa condizione (ad esempio, una chiave di stringa in un dizionario in cui tutte le chiavi sono di tipoInteger
), il metodoput(Object key, Object value)
dovrebbe chiamareClassCastException
.
GO TO FULL VERSION