JavaRush /Java blogi /Random-UZ /Java dasturchisi uchun intervyudan olingan savollar va ja...

Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish. 10-qism

Guruhda nashr etilgan
Salom! Biror narsaning ustasi bo'lish uchun necha soat kerak? Men tez-tez eshitganman: "Hamma narsada usta bo'lish uchun siz 10 000 soat sarflashingiz kerak." Qo'rqinchli raqam, shunday emasmi? Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  10-1-qismBiroq, hayronman, bu haqiqatmi? Va men doimo dasturlash san'atini o'zlashtirish uchun qancha soat sarflaganimni aniqlashga harakat qilaman. Va men o'sha qadrli 10 000 soatni bosib o'tib, usta bo'lganimda, bu farqni his qilamanmi? Yoki men allaqachon o'zim bilmagan holda ularning ustiga qadam qo'yganmanmi? Qanday bo'lmasin, dasturchi bo'lish uchun siz juda ko'p vaqt sarflashingiz shart emas. Asosiysi, undan oqilona foydalanish. Sizning asosiy maqsadingiz suhbatdan o'tishdir. Yangi kelganlar uchun intervyuda ular birinchi navbatda nazariyani so'rashadi, shuning uchun siz unda kuchli bo'lishingiz kerak. Aslida, suhbatga tayyorgarlik ko'rayotganda, sizning vazifangiz Java dasturchisining asosiy nazariyasidagi barcha kamchiliklaringizni aniqlash va ularni bilim bilan qoplashdir. Va bugun men sizga bu masalada yordam beraman, chunki men eng mashhur savollarni tahlil qilishni davom ettirish uchun keldim. Shunday ekan, davom etaylik!

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. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  10-2-qismBuning 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)
  1. Добавление нового element без указания индекса How местоположения будет происходить автоматически в конец обоих списков. В LinkedList новый элемент станет новым хвостом (происходит только перезаписывание пары ссылок — алгоритмическая сложность O(1)).

    В ArrayList будет добавлен новый элемент в последнюю пустую ячейку массива — O(1).

  2. Добавление element по индексу How правило подразумевает вставку примерно в середину списка. В LinkedList сперва будет вестись поиск нужного места с помощью перебора элементов с “хвоста” и “головы” — O(n/2), а после — вставка значения путем переопределения ссылок элементов, между которыми вставляется новый — O(1). Суммарная алгоритмическая сложность данного действия будет O(n/2).

    ArrayList в данной ситуации по индексу находит элемент — O(1), и все элементы справа (включая элемент, который уже хранится по данному индексу) двигаются на одну единицу вправо (при этом возможно понадобится создание нового списка и копирование элементов в него) — O(n/2). Суммарная сложность — O(n/2).

  3. Добавление element в начало списка в LinkedList будет ситуация схожая с добавлением в конец: новый элемент станет новой “головой” — O(1), в то же время когда ArrayList-у нужно будет двигать все элементы вправо — O(n).

Xulosa: LinkedList -da algoritmik murakkablik O(1) dan O(n/2) gacha bo'ladi . Ya'ni, kiritish ro'yxatning oxiriga yoki boshiga qanchalik yaqin bo'lsa, shunchalik tez bo'ladi. Shu bilan birga, ArrayList uchun u O(1) dan O(n) gacha bo'ladi : kiritish ro'yxat oxiriga qanchalik yaqin bo'lsa, shunchalik tez bo'ladi. Elementni (to'plamni) o'rnatish Bu operatsiya elementni ro'yxatdagi ko'rsatilgan pozitsiyaga yozadi, agar mavjud bo'lsa, avvalgisining ustiga yozadi. LinkedList -da bu operatsiya qo'shishga o'xshash bo'ladi, chunki Bu erda eng katta qiyinchilik elementni topishdir. Elementni qayta yozish bir juft havolani qayta yozish orqali amalga oshiriladi, shuning uchun bu erda ham algoritmik murakkablik pozitsiyaning ro'yxat oxiridan yoki boshidan masofasiga qarab O(1) dan O(n/2) gacha bo'ladi. O'sha paytda ushbu indeks operatsiyasi uchun ArrayList da kerakli katak topiladi va unga yangi element yoziladi. Indeks qidirish, xuddi shu operatsiya kabi, O(1) algoritmik murakkabligiga ega . Indeks bo'yicha elementni oling (olish) LinkedList- da elementni olish boshqa operatsiyalarni qidirish bilan bir xil printsipga muvofiq amalga oshiriladi - oxiri yoki boshidan masofaga qarab, ya'ni. O(1) dan O(n/2) gacha . ArrayList da , yuqorida aytganimdek, massivdagi elementni indeks bo'yicha topish O(1) murakkabligiga ega . Indeks bo'yicha elementni olib tashlash (o'chirish) LinkedList uchun uning ishlash printsipi ham shu erda ishlaydi: birinchi navbatda element topiladi, so'ngra havolalar qayta yoziladi - elementning qo'shnilari bir-biriga murojaat qila boshlaydi, bu elementga havolalarni yo'qotadi, keyinchalik axlat yig'uvchi tomonidan o'chiriladi. Ya'ni, algoritmik murakkablik hali ham bir xil - O(1) dan O(n/2) gacha . ArrayList uchun bu operatsiya yangi element qo'shish (qo'shish) operatsiyasiga ko'proq o'xshaydi. Birinchidan, kerakli element topiladi - O (1) , keyin u olib tashlanadi va uning o'ng tomonidagi barcha elementlar hosil bo'lgan bo'shliqni yopish uchun bir birlik chapga o'tkaziladi. O'chirish operatsiyasi qo'shish operatsiyasi bilan bir xil algoritmik murakkablikka ega bo'ladi - O (1) dan O (n) gacha . O'chirish ro'yxat oxiriga qanchalik yaqin bo'lsa, uning algoritmik murakkabligi shunchalik kam bo'ladi. Aslida, bularning barchasi asosiy operatsiyalar edi. Sizga eslatib o'taman: ushbu ikkita ro'yxatni solishtirganda, biz qanday aniq vaziyat haqida gapirayotganimizni aniqlab olishingiz kerak va keyin siz berilgan savolga aniq javob berishingiz mumkin.

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?

Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  10-3-qismXo'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 qismidaJava dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  10-4 qism 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. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  10-5 qism

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.
Shu nuqtada biz tahlilning keyingi qismiga qadar pauza qilamiz!Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  10-6-qism
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION