89. ArrayList LinkedList dan nimasi bilan farq qiladi?
Bu HashMap ning ichki tuzilishi haqidagi savol bilan birga eng mashhur savollardan biridir . Hech bir intervyu busiz tugamaydi va shuning uchun unga javob "tishingizdan sakrab chiqishi" kerak. Aniq - turli nomlar bilan bir qatorda, ular ichki tuzilishda farqlanadi. Ilgari biz ArrayList va LinkedList ning ichki tuzilishini ko'rib chiqdik , shuning uchun men ularni amalga oshirish tafsilotlariga kirmayman. Sizga shuni eslatib o'tamanki, ArrayList ichki massiv asosida amalga oshiriladi, bu formula bo'yicha kerak bo'lganda oshiriladi:<размерТекущегоМассива> * 3 / 2 + 1
Shu bilan birga, LinkedList ichki ikki marta bog'langan ro'yxat asosida amalga oshiriladi, ya'ni har bir element ro'yxatning boshi/oxiri bo'lgan qiymatlar bundan mustasno, oldingi va keyingisiga havolaga ega. Odamlar bu savolni quyidagi formatda berishni yaxshi ko'radilar: "Qaysi biri yaxshiroq - ArrayList yoki LinkedList ?", sizni qo'lga olish umidida. Axir, javob sifatida ulardan birini ko'rsatsangiz, bu noto'g'ri javob bo'ladi. Buning o'rniga, siz qaysi aniq vaziyat haqida gapirayotganingizni aniqlab olishingiz kerak - indeksga kirish yoki ro'yxatning o'rtasiga kiritish. Javobga qarab siz o'z tanlovingizni tushuntirib bera olasiz. ArrayList va LinkedList qanday ishlashini avvalroq tasvirlab bergan edim . Keling, taqqoslash uchun ularni bir xil sahifaga qo'yish orqali buni umumlashtiramiz: Element qo'shish (qo'shish)
-
Добавление нового element без указания индекса How местоположения будет происходить автоматически в конец обоих списков. В LinkedList новый элемент станет новым хвостом (происходит только перезаписывание пары ссылок — алгоритмическая сложность O(1)).
В ArrayList будет добавлен новый элемент в последнюю пустую ячейку массива — O(1).
-
Добавление element по индексу How правило подразумевает вставку примерно в середину списка. В LinkedList сперва будет вестись поиск нужного места с помощью перебора элементов с “хвоста” и “головы” — O(n/2), а после — вставка значения путем переопределения ссылок элементов, между которыми вставляется новый — O(1). Суммарная алгоритмическая сложность данного действия будет O(n/2).
ArrayList в данной ситуации по индексу находит элемент — O(1), и все элементы справа (включая элемент, который уже хранится по данному индексу) двигаются на одну единицу вправо (при этом возможно понадобится создание нового списка и копирование элементов в него) — O(n/2). Суммарная сложность — O(n/2). -
Добавление element в начало списка в LinkedList будет ситуация схожая с добавлением в конец: новый элемент станет новой “головой” — O(1), в то же время когда ArrayList-у нужно будет двигать все элементы вправо — O(n).
90. ArrayList HashSet dan nimasi bilan farq qiladi?
Agar ArrayList va LinkedListni operatsiyalar bo'yicha solishtirish mumkin bo'lsa - bu yaxshiroq - ArrayListni HashSet bilan solishtirish unchalik oson emas , chunki bu butunlay boshqa to'plamlar. Siz bitta shirin taomni boshqasi bilan solishtirishingiz mumkin, ammo u go'shtli taom bilan ishlaydi - ular juda boshqacha. Biroq, men ular orasidagi ba'zi farqlarni berishga harakat qilaman:-
ArrayList Ro'yxat interfeysini , HashSet esa Set interfeysini amalga oshiradi ;
-
ArrayList- da kirish element indeksi bo'yicha mumkin: get operatsiyasi algoritmik murakkabligi O(1) ga ega va HashSet -da kerakli elementni faqat qo'pol kuch bilan olish mumkin va bu O(1) dan O(n) gacha . ;
-
ArrayList ikki nusxadagi elementlarga ruxsat beradi. HashSet -da barcha elementlar noyobdir: to'plamda analogi allaqachon mavjud bo'lgan HashSet- ga element qo'shish ishlamaydi (dublikatlar hashcode yordamida tekshiriladi, shuning uchun bu to'plam nomi);
-
ArrayList ichki massiv yordamida amalga oshiriladi va HashSet ichki HashMap yordamida amalga oshiriladi ;
-
ArrayList elementlarni qo'shish tartibini saqlaydi, HashSet esa tartibsiz to'plam bo'lib, elementlar tartibini saqlamaydi;
-
ArrayList har qanday miqdordagi bo'sh qiymatlarga ruxsat beradi (null), HashSet- ga faqat bitta null qiymat qo'shilishi mumkin (axir, elementlarning o'ziga xosligi).
91. Nima uchun Java-da dinamik massivni amalga oshirishning xilma-xilligi mavjud?
Xo'sh, bu ko'proq falsafiy savol. Xo'sh, nega ular juda ko'p turli xil yangi texnologiyalarni taklif qilishadi? Qulaylik uchun. Aslida, bu ko'p sonli dinamik massiv ilovalari bilan bir xil. Ularning hech birini eng yaxshi yoki ideal deb atash mumkin emas. Ularning har biri muayyan vaziyatda afzalliklarga ega. Va bizning vazifamiz ularning farqlarini, kuchli / zaif tomonlarini bilishdir: to'g'ri vaziyatda eng mosini ishlatish imkoniyatiga ega bo'lish uchun.92. Nima uchun Java-da kalit-qiymatni saqlashning turli xil ilovalari mavjud?
Bu erda vaziyat dinamik massiv ilovalari bilan bir xil. Eng yaxshisi yo'q: har birining kuchli va zaif tomonlari bor. Va biz, albatta, o'z kuchimizdan maksimal darajada foydalanishimiz kerak. Misol: ko'p tarmoqli texnologiyalarni o'z ichiga olgan bir vaqtning o'zida to'plam o'zining Concurrent to'plamlariga ega. Xuddi shu ConcurrentHashMap oddiy HashMap bilan solishtirganda ma'lumotlar bilan ko'p tarmoqli ishlash xavfsizligida afzalliklarga ega , lekin ko'p tarmoqli bo'lmagan muhitda u tezlikni yo'qotadi. Xo'sh, har qanday vaziyatda eng kuchli bo'lmagan ilovalar asta-sekin qo'llanilmaydi. Misol: Hashtable dastlab ish zarralari uchun xavfsiz HashMap bo'lishi uchun mo'ljallangan edi , lekin ConcurrentHashMap uni ko'p tarmoqli muhitda ortda qoldirdi va Hashtable oxir-oqibat unutildi va endi ishlatilmadi.93. Elementlar to‘plami qanday tartiblanadi?
Aytish kerak bo'lgan birinchi narsa, yig'ish elementi sinfi Comparable interfeysi va uning compareTo usulini amalga oshirishi kerak . Yoki Comaprator-ni taqqoslash usuli bilan amalga oshiradigan sinf kerak . Ular haqida ko'proq ma'lumotni ushbu postda o'qishingiz mumkin . Ikkala usul ham ma'lum turdagi ob'ektlarni qanday taqqoslash kerakligini aniqlaydi. Saralashda bu juda muhim, chunki siz elementlarni solishtirish mumkin bo'lgan printsipni tushunishingiz kerak. Buning asosiy usuli - to'g'ridan-to'g'ri tartiblashni xohlagan sinfda amalga oshiriladigan Comparable ni amalga oshirishdir. Shu bilan birga, Comparatordan foydalanish kamroq tarqalgan. Aytaylik, siz solishtiriladigan ilovaga ega bo'lmagan kutubxonadagi sinfdan foydalanyapsiz , lekin uni qandaydir tarzda saralashingiz kerak bo'ladi. Ushbu klassning kodini o'zgartira olmasdan (uni kengaytirishdan tashqari) siz Comparator dasturini yozishingiz mumkin , unda siz ushbu sinf ob'ektlarini qaysi printsip asosida solishtirmoqchi ekanligingizni ko'rsatasiz. Va yana bir misol. Aytaylik, sizga bir xil turdagi ob'ektlarni saralash uchun turli xil printsiplar kerak, shuning uchun siz turli vaziyatlarda foydalanadigan bir nechta Comparatorlarni yozasiz. Qoidaga ko'ra, qutidan tashqaridagi ko'plab sinflar allaqachon taqqoslanadigan interfeysni amalga oshiradi - bir xil String . Aslida, ulardan foydalanganda, ularni qanday solishtirish haqida tashvishlanishingiz shart emas. Siz shunchaki ularni olib, ulardan foydalanasiz. Birinchi va eng aniq yo'l - elementlar sinfi komparatoriga muvofiq elementlarni tartiblangan tartibda saqlaydigan TreeSet yoki TreeMap tipidagi to'plamdan foydalanish . Esda tutingki, TreeMap kalitlarni tartiblaydi, lekin qiymatlarni emas. Agar siz Comparable o'rniga Comparator ilovasidan foydalansangiz , yaratilgandan so'ng uning ob'ektini to'plam konstruktoriga o'tkazishingiz kerak bo'ladi:TreeSet treeSet = new TreeSet(customComparator);
Ammo boshqa turdagi to'plamingiz bo'lsa-chi? Uni qanday saralash kerak? Bunday holda, Collections yordamchi sinfining ikkinchi usuli mos keladi - sort() usuli . Bu statik, shuning uchun sizga faqat sinf nomi va kerakli ro'yxat uzatiladigan usul kerak bo'ladi. Masalan:
Collections.sort(someList);
Agar siz Comparable dan foydalanmasangiz , balki Comparator dasturini amalga oshirsangiz , uni ikkinchi parametr sifatida topshirishingiz kerak:
Collections.sort(someList, customComparator);
Natijada, o'tkazilgan ro'yxat elementlarining ichki tartibi o'zgaradi: u elementlar taqqoslagichiga ko'ra tartiblanadi. E'tibor bering, uzatilgan elementlar ro'yxati o'zgaruvchan bo'lishi kerak, ya'ni. o'zgaruvchan, aks holda usul ishlamaydi va UnsupportedOperationException tashlanadi . Uchinchi usul sifatida , agar taqqoslanadigan dastur ishlatilsa , to'plam elementlarini saralaydigan Oqimni tartiblash operatsiyasidan foydalanishingiz mumkin :
someList = someList.stream().sorted().collect(Collectors.toList());
solishtiruvchi bo'lsa :
someList = someList.stream().sorted(customComparator).collect(Collectors.toList());
Ushbu maqolada Stream haqida ko'proq o'qishingiz mumkin . To'rtinchi usul - qabariq sort yoki birlashtirish kabi tartiblashni qo'lda amalga oshirish .
ClassObject. Tenglar va HashCode
94. Java tilidagi sinf obyektiga qisqacha tavsif bering
Tahlilning ikkinchi qismida biz Object sinfining usullari haqida gapirgan edik va men sizga Object klassi Java-dagi barcha sinflarning avlodi ekanligini eslatib o'taman . Unda 11 ta usul mavjud bo'lib, ular mos ravishda barcha sinflar tomonidan meros qilib olinadi. Barcha 11 usul haqida ma'lumotni muhokamaning ikkinchi qismida topish mumkin .95. Java-da Equals va HashCode nima uchun ishlatiladi?
hashCode() ob'ekt sinfining barcha sinflar tomonidan meros qilib olingan usulidir . Uning vazifasi ma'lum bir ob'ektni ifodalovchi ba'zi raqamni yaratishdir. Ushbu usuldan foydalanishga misol qilib, mahalliy xeshkodni qo'shimcha aniqlash uchun kalit ob'ektdagi HashMap- da foydalanish mumkin , bu juftlik saqlanadigan ichki massivning (chelak) katakchasini aniqlaydi. Biz tahlilning 9-qismida HashMap ishi haqida batafsil gaplashdik , shuning uchun biz bu haqda ko'p to'xtalmaymiz. Bundan tashqari, qoida tariqasida, bu usul teng () usulida ob'ektlarning identifikatorini aniqlash uchun uning asosiy vositalaridan biri sifatida qo'llaniladi. equals() Ob'ekt sinfining usuli bo'lib , uning vazifasi ob'ektlarni solishtirish va ularning teng yoki teng emasligini aniqlashdir. Bu usul ob'ektlarni solishtirish kerak bo'lgan hamma joyda qo'llaniladi, chunki == yordamida odatiy taqqoslash ob'ektlar uchun mos emas, chunki faqat ularga havolalarni solishtiradi.96. Java-da Equals va HashCode o'rtasidagi shartnoma haqida gapirib bering?
Men aytmoqchi bo'lgan birinchi narsa, equals() va hashCode() usullari to'g'ri ishlashi uchun ularni to'g'ri bekor qilish kerak. Shundan so'ng ular quyidagi qoidalarga amal qilishlari kerak:- Tenglar orqali taqqoslash rostni qaytaradigan bir xil ob'ektlar bir xil xesh kodlariga ega bo'lishi kerak ;
- bir xil xesh kodlari bo'lgan ob'ektlar har doim ham teng bo'lmasligi mumkin.
GO TO FULL VERSION