JavaRush /Java blogi /Random-UZ /Java yadrosi. Intervyu uchun savollar, 3-qism
Vadim625
Daraja

Java yadrosi. Intervyu uchun savollar, 3-qism

Guruhda nashr etilgan
Oldingi ikki maqolada biz intervyularda tez-tez so'raladigan ba'zi muhim savollarni muhokama qildik. Davom etish va qolgan savollarga qarash vaqti keldi.
Java yadrosi.  Intervyu savollari, 3-1-qism

Chuqur nusxalash va sayoz nusxalash

Asl nusxaning aniq nusxasi uning klonidir. Java-da bu asl ob'ektga o'xshash tuzilishga ega ob'ektni yaratish imkoniyatini anglatadi. Usul clone()ushbu funktsiyani ta'minlaydi. Sayoz nusxa ko'chirish, iloji boricha kamroq ma'lumot. Odatiy bo'lib, Java-da klonlash sayoz, ya'ni. Object classu nusxa ko'chirayotgan sinfning tuzilishi haqida bilmaydi. Klonlashda JVM quyidagilarni bajaradi:
  1. Agar sinfda faqat ibtidoiy turdagi a'zolar bo'lsa, u holda ob'ektning butunlay yangi nusxasi yaratiladi va bu ob'ektga havola qaytariladi.
  2. Agar sinfda nafaqat ibtidoiy tiplarning a'zolari, balki boshqa har qanday sinf tipining a'zolari ham bo'lsa, u holda bu sinflar ob'ektlariga havolalar ko'chiriladi. Shuning uchun ikkala ob'ekt ham bir xil havolalarga ega bo'ladi.
Chuqur nusxalash hamma narsani takrorlaydi. Chuqur nusxa ko'chirish ikkita to'plam bo'lib, ulardan biri asl to'plamning barcha elementlarini takrorlaydi. Biz nusxani shunday yaratmoqchimizki, nusxaning biron bir elementiga o'zgartirish kiritish asl to'plamga ta'sir qilmaydi. Chuqur klonlash quyidagi qoidalarni talab qiladi:
  1. Ibtidoiy ma'lumotlarni alohida nusxalashning hojati yo'q;
  2. Asl sinfdagi barcha a'zolar sinflari klonlashni qo'llab-quvvatlashi kerak. super.clone()Har bir sinf a'zosi uchun usul bekor qilinganda chaqirilishi kerak clone();
  3. Agar sinfning biron bir a'zosi klonlashni qo'llab-quvvatlamasa, u holda klonlash usulida siz ushbu sinfning yangi nusxasini yaratishingiz va uning har bir a'zosini barcha atributlari bilan yangi sinf ob'ektiga birma-bir nusxalashingiz kerak.
Bu yerda klonlash haqida ko'proq bilib oling

Sinxronizatsiya nima? Ob'ekt darajasida qulflash va sinf darajasida qulflash?

Sinxronizatsiya ko'p ish zarralarini bildiradi. Sinxronlashtirilgan kod bloki bir vaqtning o'zida faqat bitta ip tomonidan bajarilishi mumkin. Java bir vaqtning o'zida bir nechta mavzularni qayta ishlashga imkon beradi. Bu ikki yoki undan ortiq mavzularning bir xil maydonga kirishni xohlashiga olib kelishi mumkin. Sinxronizatsiya xotira resurslaridan noto'g'ri foydalanilganda yuzaga keladigan xotira xatolaridan qochishga yordam beradi. Usul sinxronlashtirilgan deb e'lon qilinganda, ip o'z monitorini ushlab turadi. Agar boshqa oqim sinxronlashtirilgan usulga kirishga harakat qilsa, ip bloklanadi va monitor bo'sh bo'lishini kutadi. Java'da sinxronizatsiya maxsus sinxronlashtirilgan kalit so'z bilan amalga oshiriladi . Siz sinfingizdagi alohida bloklar yoki usullarni shu tarzda belgilashingiz mumkin. Sinxronlashtirilgan kalit so'zni sinf o'zgaruvchilari yoki atributlari bilan birgalikda ishlatib bo'lmaydi. Ob'ekt darajasida blokirovkalash - bu statik bo'lmagan usulni yoki statik bo'lmagan kod blokini sinxronlashtirmoqchi bo'lgan mexanizm bo'lib, sinfning berilgan namunasida kod blokini faqat bitta ip bajarishi mumkin. Bu har doim sinf namunasi ish zarrachasini xavfsiz qilish uchun bajarilishi kerak. Sinf darajasidagi qulflash sinfning barcha mavjud misollari uchun sinxronlangan blokga bir nechta oqimlarni kiritishni oldini oladi. Misol uchun, agar DemoClass sinfining 100 ta namunasi mavjud bo'lsa, u holda ma'lum bir vaqtda o'zgaruvchilardan biri yordamida demoMethod() ni faqat 1 ta ip bajara oladi. Bu har doim statik ipning xavfsizligini ta'minlash uchun bajarilishi kerak. Sinxronizatsiya haqida ko'proq bilib oling.

Uyqu() va kutish() o'rtasidagi farq nima?

Sleep()jarayonni bir necha soniya kechiktirish uchun ishlatiladigan usuldir. bo'lsa , biz yoki usulini wait()chaqirmagunimizcha, ip kutish holatida bo'ladi . Asosiy farq shundaki, u monitor qulfini bo'shatadi, lekin u qulfni ochmaydi. ko'p tarmoqli ilovalar uchun ishlatiladi, shunchaki ip bajarilishini to'xtatib turish uchun ishlatiladi. joriy ipni ma'lum vaqt davomida "Ishga tushirish mumkin emas" holatiga qo'yadi. Tarmoq monitorning ushbu usul chaqirilishidan oldingi holatini saqlaydi. Agar boshqa ip chaqirsa , "uxlab qolgan" ip uyg'onadi. E'tibor bering, bu statik usul, ya'ni u har doim joriy oqimga ta'sir qiladi (usulni bajaruvchi ). Keng tarqalgan xato - bu boshqa mavzuni qo'ng'iroq qilish; usulni chaqirgan joriy ip ip bo'lmasa ham. joriy ipni xuddi ga o'xshab bir muncha vaqt "Ishga tushirish mumkin emas" holatiga yuboradi, lekin ba'zi nuanslar bilan. ipga emas, balki ob'ektga chaqiriladi; biz ushbu ob'ektni "qulflash ob'ekti" deb ataymiz. Qo'ng'iroq qilishdan oldin , joriy ip "qulflash ob'ekti" bilan sinxronlashtirilishi kerak; shundan so'ng, u ushbu qulfni chiqaradi va ipni ushbu qulf bilan bog'liq "kutish ro'yxati" ga qo'shadi. Keyinchalik, boshqa ish zarrachalari bir xil qulflash ob'ekti bilan sinxronlashishi va . Ushbu usul hali ham kutayotgan asl ipni "uyg'otadi". Printsipial jihatdan / bilan solishtirish mumkin / , faqat faol ipga uxlab yotgan ipga to'g'ridan-to'g'ri ko'rsatgich kerak emas, u faqat umumiy blokirovka ob'ektini bilishi kerak. Bu erda batafsil farqni o'qing.notify()notifyAll()wait()sleep()Wait()sleep()Thread.sleep()t.interrupt()sleep()sleep()t.sleep()tsleep()tObject.wait()sleep()Wait()lock.wait()wait()lock.notify()wait()notify()sleep()interrupt()

Bu mos yozuvlar o'zgaruvchiga null belgilash mumkinmi?

Mumkin emas. Java-da tayinlash operatorining chap tomoni o'zgaruvchi bo'lishi kerak. "Bu" har doim sinfning joriy nusxasini beradigan maxsus kalit so'zdir. Bu shunchaki har qanday o'zgaruvchi emas. Xuddi shunday, nullni o'zgaruvchiga "super" kalit so'zi yoki boshqa shunga o'xshash kalit so'z yordamida belgilash mumkin emas.

&& va & o'rtasidagi farq nima?

&- bit bo'yicha va &&- mantiqiy.
  1. &operatsiyaning har ikki tomonini baholaydi;
  2. &&operatsiyaning chap tomonini baholaydi. Agar rost bo'lsa, u o'ng tomonni baholashda davom etadi.
Chuqurroq tushunish uchun bu yerga qarang.

equals() va hachCode() usullarini qanday bekor qilish mumkin?

hashCode()va usullar Java obyektlari uchun asosiy sinf bo'lgan equals()sinfda aniqlanadi . ObjectShu sababli, barcha Java ob'ektlari usullar uchun standart dasturni meros qilib oladi. Usul hashCode()berilgan ob'ekt uchun yagona butun sonni olish uchun ishlatiladi. Bu butun son ob'ektni saqlash kerak bo'lganda, masalan, ob'ektning joylashishini aniqlash uchun ishlatiladi HashTable. Odatiy bo'lib, ob'ekt saqlanadigan xotira joylashuvi manzili ko'rinishini hashCode()qaytaradi . integerUsul equls(), uning nomidan ko'rinib turibdiki, ikkita ob'ekt teng yoki yo'qligini tekshirish uchun ishlatiladi. Standart dastur ob'ekt havolalarini ularning teng yoki yo'qligini tekshiradi. Quyida ushbu usullarni qayta yuklash bo'yicha muhim ko'rsatmalar keltirilgan:
  1. hashCode()va yaratishda har doim bir xil ob'ekt atributlaridan foydalaning equals();
  2. Simmetriya. Bular. xagar u ba'zi ob'ektlar uchun true qiymatini qaytarsa y x.equals(y), u holda u y.equals(x)true qiymatini qaytarishi kerak;
  3. Reflektorlik. Har qanday ob'ekt uchun x x.equals(x)true qiymatini qaytarish kerak;
  4. Muvofiqlik. Har qanday ob'ektlar uchun xva y x.equals(y)taqqoslashda ishlatiladigan ma'lumotlar o'zgarmasa, xuddi shu narsani qaytaradi;
  5. Tranzitivlik. Har qanday ob'ektlar uchun x, yva z, agar x.equals(y)u true bo'lsa va y.equals(z)rost bo'lsa, u holda u x.equals(z)true qiymatini qaytarishi kerak;
  6. Ilovani bajarish jarayonida bir xil ob'ektda usul chaqirilganda, agar foydalanilgan ma'lumot o'zgarmasa, u bir xil raqamni qaytarishi kerak. hashCodeturli xil dastur misollarida bir xil ob'ektlar uchun turli qiymatlarni qaytarishi mumkin;
  7. ga ko'ra ikkita ob'ekt teng bo'lsa equals, ular hashCodebir xil qiymatlarni qaytarishlari kerak;
  8. Qarama-qarshi talab ixtiyoriydir. Ikkita teng bo'lmagan ob'ektlar bir xil hashCode-ni qaytarishi mumkin. Biroq, ishlashni yaxshilash uchun turli ob'ektlar turli xil kodlarni qaytarishi yaxshiroqdir.
Ushbu usullar haqida qiziqarli ma'lumotlarni bu erda o'qing.

Kirish modifikatorlari haqida bizga xabar bering

Java sinflari, maydonlari, konstruktorlari va usullari to'rt xil kirish modifikatorlaridan biriga ega bo'lishi mumkin: xususiy Agar usul yoki o'zgaruvchi xususiy deb belgilangan bo'lsa , u holda faqat bir sinf ichidagi kod o'zgaruvchiga kirishi yoki usulni chaqirishi mumkin. Subklasslar ichidagi kod o'zgaruvchiga yoki usulga kira olmaydi yoki boshqa sinfdan ham unga kira olmaydi. Shaxsiy kirish modifikatori ko'pincha konstruktorlar, usullar va o'zgaruvchilar uchun ishlatiladi. standart Agar modifikator umuman ko'rsatilmagan bo'lsa, standart kirish modifikatori e'lon qilinadi. Ushbu modifikator ma'lum bir sinfning maydonlari, konstruktorlari va usullariga kirishni sinfning o'zi ichidagi kod, bir xil paketdagi sinflar ichidagi kod orqali olish mumkinligini anglatadi. Subklasslar, agar ular sukut bo'yicha e'lon qilingan bo'lsa, superklassning usullari va a'zo o'zgaruvchilariga kira olmaydi , agar quyi sinf superklass bilan bir xil paketda bo'lmasa. protected Himoyalangan modifikator sukut bo'yicha bir xil ishlaydi , bundan tashqari quyi sinflar himoyalangan usullar va yuqori sinf o'zgaruvchilariga ham kirishlari mumkin. Agar pastki sinf superklass bilan bir xil paketda bo'lmasa ham, bu bayonot to'g'ri. public Ommaviy kirish modifikatori barcha kodlar sinfga, uning oʻzgaruvchilariga, konstruktorlariga yoki usullariga, shu kod qayerda joylashganidan qatʼiy nazar kirishi mumkinligini bildiradi. Java yadrosi.  Suhbat uchun savollar, 3-2 qism

Axlat yig'uvchi nima? Biz uni chaqira olamizmi?

Axlat yig'ish Java va NET.Framework tillari kabi ko'plab zamonaviy dasturlash tillarida avtomatik xotirani boshqarish xususiyati hisoblanadi. Axlat yig'ishni ishlatadigan tillar ko'pincha JVM kabi virtual mashinada axlat yig'ishni talqin qiladi. Chiqindilarni yig'ish ikkita maqsadni ko'zlaydi: foydalanilmagan xotirani bo'shatish kerak va agar dastur hali ham undan foydalansa, xotira bo'shatilmasligi kerak. Axlat yig'ishni qo'lda boshqara olasizmi? Yo'q, System.gc()bu sizga imkon qadar ko'proq kirish imkonini beradi. Eng yaxshi variant - bu usulni chaqirish System.gc(), bu axlat yig'uvchiga ishlashi kerakligiga ishora qiladi. Uni darhol ishga tushirishning imkoni yo'q, chunki axlat yig'uvchi deterministik emas. Bundan tashqari, hujjatlarga ko'ra, OutOfMemoryErroragar virtual mashina to'liq axlat yig'ilgandan so'ng xotirani bo'shatolmasa, u yo'naltirilmaydi. Bu yerda axlat yig'uvchi haqida ko'proq bilib oling.

Mahalliy kalit so'z nimani anglatadi? Batafsil tushuntiring

Mahalliy kalit so'z usul Java faylidan boshqa dasturlash tilida amalga oshirilganligini ko'rsatish uchun ishlatiladi. O'tmishda mahalliy usullar qo'llanilgan. Java ning joriy versiyalarida bu kamroq talab qilinadi. Hozirgi vaqtda mahalliy usullarga quyidagilar kerak bo'ladi:
  1. Java'dan boshqa tilda yozilgan kutubxonaga qo'ng'iroq qilishingiz kerak.
  2. Siz faqat boshqa til (odatda C) yordamida kirish mumkin bo'lgan tizim yoki apparat resurslariga kirishingiz kerak. Aslida, haqiqiy kompyuter bilan o'zaro ta'sir qiluvchi ko'plab tizim funktsiyalari (masalan, disklar yoki tarmoq ma'lumotlari) faqat mahalliy usul bilan chaqirilishi mumkin.
Mahalliy usul kutubxonalaridan foydalanishning kamchiliklari ham muhim:
  1. JNI/JNA JVM ni beqarorlashtirishi mumkin, ayniqsa siz murakkab narsalarni qilishga harakat qilsangiz. Agar sizning mahalliy usulingiz noto'g'ri ish qilsa, JVM ishdan chiqishi ehtimoli bor. Bundan tashqari, agar sizning mahalliy usulingiz bir nechta mavzulardan chaqirilsa, yomon narsalar yuz berishi mumkin. Va hokazo.
  2. Mahalliy kod bilan dasturni disk raskadrovka qilish qiyinroq .
  3. Native kod boshqa platformalarga o'tkazishda muammolarni keltirib chiqaradigan ramkalarni alohida qurishni talab qiladi.

Serializatsiya nima?

Informatika fanida ma'lumotlarni saqlash va uzatish kontekstida ketma-ketlashtirish ma'lumotlar strukturasini yoki ob'ekt holatini keyinchalik boshqa hisoblash muhitida saqlanishi va olinishi mumkin bo'lgan formatga o'tkazish jarayonidir. Bitlar seriyasini olgandan so'ng, ular ketma-ketlashtirish formatiga muvofiq qayta hisoblab chiqiladi va ular asl ob'ektning semantik jihatdan bir xil klonini yaratish uchun ishlatilishi mumkin. Java avtomatik seriyalashni ta'minlaydi, bu ob'ektni interfeysni amalga oshirishni talab qiladi java.io.Serializable. Interfeysni amalga oshirish sinfni "seriyalash mumkin" deb belgilaydi. Java.io.Serializable interfeysida ketma-ketlashtirish usullari mavjud emas, lekin serializatsiya qilinadigan sinf ixtiyoriy ravishda serializatsiya/diserializatsiya jarayonining bir qismi sifatida chaqiriladigan usullarni belgilashi mumkin. Sinflarga o'zgartirishlar kiritayotganda, qaysi biri ketma-ketlashtirishga mos kelishini va mos kelmasligini hisobga olishingiz kerak. Toʻliq koʻrsatmalarni bu yerda oʻqishingiz mumkin. Men eng muhim fikrlarni beraman: Mos kelmaydigan o'zgarishlar:
  1. Maydonni o'chirish;
  2. Sinfni ierarxiyada yuqoriga yoki pastga siljiting;
  3. Statik bo'lmagan maydonni statikga yoki o'tkinchi bo'lmagan o'tkinchiga o'zgartirish;
  4. E'lon qilingan ibtidoiy ma'lumotlar turini o'zgartirish;
  5. WriteObjectSukut ReadObjectbo'yicha maydonlarni endi yozmasliklari yoki o'qimasliklari uchun usulni o'zgartirish ;
  6. SerializableSinfni o'zgartirish Externalizableyoki aksincha;
  7. Enum sinfini noaniq sinfga yoki aksincha o'zgartirish ;
  8. Olib tashlash Serializableyoki Externalizable;
  9. Sinfga usul writeReplaceqo'shish .readResolve
Mos keladigan o'zgarishlar:
  1. Maydonlarni qo'shish;
  2. Sinflarni qo'shish/o'chirish;
  3. Usullarni qo'shish WriteObject/ReadObject[usullar defaultReadObjectyoki defaultWriteObjectboshida chaqirilishi kerak];
  4. Olib tashlash usullari WriteObject/ReadObject;
  5. Qo'shimcha java.io.Serializable;
  6. Maydonga kirishni o'zgartirish;
  7. Statik maydonni statik bo'lmaganga yoki vaqtinchalik o'tkinchiga o'zgartirish .
Oldingi qismlarga havolalar: Java Core. Intervyu savollari, Java Core 1-qism. Intervyu savollari, 2-qism Asl maqola. Baxtli o'qish!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION