Pertanyaan dalam artikel ini:
Masalah umum- Apa itu koleksi di Jawa? Sebutkan kelebihannya
- Beritahu kami tentang hierarki koleksi
- Mengapa koleksi tidak mewarisi antarmuka
Cloneable
danSerializable
? - Mengapa
Map
antarmuka tidak mewarisi antarmukaCollection
?
- Mengapa kami menggunakan daftar? Kelas utama apa yang mengimplementasikan antarmuka
List
? - Bagaimana cara mengubah array string menjadi
ArrayList
? - Bagaimana cara mengurutkan daftar dalam urutan terbalik?
- Mengapa kami menggunakan set? Kelas utama apa yang mengimplementasikan antarmuka
Set
? - Bagaimana elemen disimpan di
HashSet
? - Bisakah suatu elemen
null
ditambahkan keTreeSet
orHashSet
?
- Mengapa kami menggunakan kamus? Kelas utama apa yang mengimplementasikan antarmuka
Map
? - Apa itu
IdentityHashMap
danWeakHashMap
? - Jelaskan apa ini
ConcurrentHashMap
? Bagaimana cara kerjanya? - Bagaimana cara kerja kamus?
- Bagaimana cara membuat kunci kamus yang baik?
- Tampilan konten apa yang disediakan antarmuka
Map
? - Kapan Anda harus menggunakannya
HashMap
dan kapan Anda harus menggunakannyaTreeMap
?
- Apa perbedaan antara
Set
danList
? - Apa perbedaan antara
List
danMap
? - Sebutkan perbedaan antara
HashMap
danHashTable?
- Apa perbedaan antara
Vector
danArrayList
? - Apa perbedaan antara
Iterator
danEnumeration
? - Apa perbedaan antara
HashMap
danHashSet
? - Apa perbedaan antara
Iterator
danListIterator
? - Apa perbedaan antara
TreeSet
danSortedSet
? - Apa perbedaan antara
ArrayList
danLinkedList
?
- Bagaimana cara membuat koleksi menjadi hanya-baca?
- Bagaimana cara membuat koleksi yang aman untuk thread?
- Mengapa tidak ada metode
Iterator.add()
untuk menambahkan elemen ke koleksi? - Apa cara yang ada untuk mengulangi elemen daftar?
- Bagaimana Anda memahami properti iterator agar berfungsi
fail-fast
? - Apa perbedaan antara
fail-fast
danfail-safe
? - Bagaimana cara menghindari
ConcurrentModificationException
saat mengulangi koleksi? - Apa yang terjadi
UnsupportedOperationException
? - Kelas koleksi manakah yang memberikan akses ke elemen apa pun?
- Apa yang terjadi
BlockingQueue
? - Apa itu antrian dan tumpukan, sebutkan perbedaannya?
- Apa itu antarmuka
Comparable
danComparator
? - Apa itu kelas
Collections
danArrays
? - Daftar literatur bekas
Masalah umum
-
Apa itu koleksi di Jawa? Sebutkan kelebihannya?
Secara definisi, koleksi adalah suatu objek yang merupakan sekelompok objek. Seperti dalam teori himpunan, himpunan adalah sekelompok benda. Sederhana, bukan? Sebelum JDK 1.2, ada kelas seperti
Vector
danHashTable
, tetapi tidak ada kerangka kerjaCollection
. Kemudian diputuskan untuk menambahkan dukungan untuk struktur data yang dapat digunakan kembali. Kerangka kerja ini dikembangkan terutama oleh Joshua Bloch, dan pertama kali muncul di JDK 1.2.Kami dapat membuat daftar keuntungan utama:
- Mengurangi waktu yang dihabiskan untuk menulis kode
- Peningkatan kinerja melalui penggunaan algoritma dan struktur data yang sangat efisien
- Koleksi adalah cara universal untuk menyimpan dan mentransfer data, yang menyederhanakan interaksi berbagai bagian kode
- Mudah dipelajari karena hanya antarmuka paling atas dan pengoperasian yang didukung yang perlu dipelajari
-
Ceritakan kepada kami tentang hierarki koleksi?
Seperti yang ditunjukkan dalam gambar, kerangka koleksi berisi satu antarmuka tingkat atas -
Collection
, yang darinyaSet
,List
dan diwarisiQueue
. Di bawah ini kita akan melihat lebih banyak kelas yang terdapat dalam ketiga cabang ini. Ingat judul antarmukaCollection
, ini akan membantu Anda dengan banyak pertanyaan.public interface Collection extends Iterable { //описание методов }
Kerangka kerja ini juga berisi antarmuka Peta , yang bukan merupakan turunan dari
Collection
. Kita akan melihat alasan mengapa dia tidak mendapat warisanCollection
pada pertanyaan keempat. -
Mengapa koleksi tidak mewarisi antarmuka
Cloneable
danSerializable
?Jawaban paling sederhana adalah “karena itu tidak perlu.” Fungsionalitasnya disediakan oleh antarmuka
Cloneable
danSerializable
tidak diperlukan untuk koleksi.Alasan lainnya adalah subkelas tidak selalu diperlukan
Cloneable
karena setiap operasi kloning menghabiskan banyak memori, dan pemrogram yang tidak berpengalaman dapat menyia-nyiakannya tanpa memahami konsekuensinya.Dan alasan terakhir adalah kloning dan serialisasi adalah operasi yang sangat spesifik, dan harus diterapkan hanya jika diperlukan. Banyak kelas koleksi yang mengimplementasikan antarmuka ini, tetapi sama sekali tidak perlu mengimplementasikannya untuk semua koleksi secara umum. Jika Anda memerlukan kloning dan serialisasi, gunakan saja kelas-kelas yang ada, jika tidak, gunakan kelas-kelas yang tersisa.
-
Mengapa
Map
antarmuka tidak mewarisi antarmukaCollection
?Jawaban yang bagus untuk pertanyaan ini adalah “karena keduanya tidak kompatibel.” Antarmuka
Collection
menjelaskan metodenyaadd(Object o)
.Kamus tidak dapat memuat metode ini karena bekerja dengan pasangan kunci/nilai. Selain itu, kamus memiliki representasi
keySet
yangvalueSet,
tidak ada dalam koleksi.Karena perbedaan ini, antarmuka
Map
tidak dapat mewarisi antarmukaCollection
, dan merupakan cabang hierarki yang terpisah.
Pertanyaan tentang daftar
-
Mengapa kami menggunakan daftar? Kelas utama apa yang mengimplementasikan antarmuka
List
?Daftar di Java adalah kumpulan elemen yang diurutkan. Setiap elemen memiliki indeks yang dimulai dari nol. Semua indeks bersifat unik. Selain metode yang dijelaskan di antarmuka
Collection
, daftar memiliki metodenya sendiri, terutama untuk bekerja dengan elemen koleksi berdasarkan indeksnya. Anda dapat membagi metode ini menjadi 3 grup - mencari elemen, mendapatkan elemen tertentu, mengulangi koleksi, dan memilih subgrup. Semua operasi ini dapat dilakukan dengan indeks elemen.Kelas utama yang mengimplementasikan antarmuka
List
adalahStack
,Vector
,ArrayList
danLinkedList
. Untuk informasi lebih rinci tentangnya, silakan merujuk ke dokumentasi. -
Bagaimana cara mengubah array string menjadi
ArrayList
?Pertanyaan ini agak lebih dalam dari sekedar pemrograman, seperti yang terlihat bagi pemula. Tujuannya adalah untuk menguji pengetahuan kandidat tentang kelas utilitas kerangka kerja
Collection
. Mari kita pertimbangkan dua kelas yang paling diminati selama wawancara -Collections
danArrays
.Kelas
Collections
menyediakan metode statis untuk operasi pada koleksi. Oleh karena itu,Arrays
ia menyediakan metode statis untuk operasi pada array.String[] words = {"аз", "буки", "веди", "глагол", "добро"}; //Как вы можете обратить внимание, у нас есть массив строк String[] words. //В котором у нас лежат 5 строк. List wordList = Arrays.asList(words); //легким движением руки, а точнее вызовом Arrays.asList() мы превратor наш //массив строк в список List wordList.
Saya juga ingin mencatat bahwa metode ini tidak hanya mampu memproses string, tetapi juga akan membuat daftar elemen jenis apa pun yang berisi array.
Integer[] nums = {1, 2, 3, 4}; List numList = Arrays.asList(nums);
-
Bagaimana cara mengurutkan daftar dalam urutan terbalik?
Seperti pertanyaan sebelumnya, pertanyaan ini menguji pengetahuan Anda tentang kelas utilitas.
Collection
List reversedList = Collections.reverse(list);
Pertanyaan tentang set
-
Mengapa kami menggunakan set? Kelas utama apa yang mengimplementasikan antarmuka
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ов-ключей.Sebagai berikut dari penjelasan di atas, kunci yang baik harus memberikan kunci yang sama
hashCode
berulang kali, tidak peduli berapa kali diminta. Dan juga, kunci yang identikequals()
harus mengembalikan nilai true saat memanggil suatu metode, dan kunci yang berbeda harus mengembalikan nilai salah.Oleh karena itu, kandidat terbaik untuk peran kunci adalah kelas yang tidak dapat diubah.
Anda dapat membaca lebih lanjut di .
-
Tampilan konten apa yang disediakan antarmuka
Map
?Antarmuka
Map
menyediakan tiga tampilan data yang disimpan:- kumpulan semua kunci
- kumpulan semua nilai
- sekumpulan objek
Entry
yang berisi kunci dan nilai
Anda dapat menavigasinya menggunakan iterator.
-
Kapan Anda harus menggunakannya
HashMap
dan kapan Anda harus menggunakannyaTreeMap
?HashMap
ini adalah kelas yang sangat banyak digunakan dan Anda mengetahuinya. Jadi, saya akan membatasi diri untuk mengatakan bahwa ini menyimpan pasangan kunci/nilai dan memungkinkan Anda melakukan banyak operasi pada pasangan tersebut.TreeMap
ini adalah variasi khususHashMap
. Bedanya, kuncinyaTreeMap
disimpan secara tertib. Standarnya adalah "penyortiran alami". Anda dapat mengganti penyortiran dengan memberikan instance kelasComparator
, yang metodenyacompare
akan digunakan untuk mengurutkan kunci.Harap dicatat bahwa semua kunci yang ditambahkan ke kamus harus mengimplementasikan antarmuka
Comparable
(ini diperlukan untuk penyortiran). Selain itu, semua kunci harus kompatibel satu sama lain:k1.compareTo(k2)
tidak boleh dipanggilClassCastException
dank1
disimpank2
dalam kamus. Jika pengguna mencoba memasukkan kunci ke dalam kamus yang melanggar ketentuan ini (misalnya, kunci string ke dalam kamus yang semua kuncinya bertipeInteger
), metodeput(Object key, Object value)
harus memanggilClassCastException
.
GO TO FULL VERSION