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

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

Guruhda nashr etilgan
Salom! Hatto eng tezkor kema ham to'lqinlar bo'ylab harakatlanadi. Agar siz hozir mening maqolamni o'qiyotgan bo'lsangiz, aniq maqsadingiz bor. Asosiysi, adashish emas, balki o'z yo'nalishingizga oxirigacha amal qilish - Java dasturchisi bo'lish. Bugun men Java dasturchilari uchun 250 dan ortiq savollarni tahlil qilishni davom ettirmoqchiman, bu sizga nazariyadagi ba'zi kamchiliklarni qoplashga yordam beradi. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  11-1-qism

97. Tenglarni qayta belgilashda kelishuvni qayta belgilash shartlari qo'yiladimi?

Overridden equals() usuli quyidagi shartlarga (qoidalarga) mos kelishi kerak:
  • refleksivlik - har qanday x qiymati uchun, x.equals(x) kabi ifoda har doim haqiqatni qaytarishi kerak (qachon x != null ).

  • simmetriya - x va y ning har qanday qiymatlari uchun x.equals(y) ko'rinishidagi ifoda faqat y.equals(x) rost bo'lsa, rostni qaytarishi kerak .

  • tranzitivlik - x , y va z ning har qanday qiymatlari uchun , agar x.equals(y) rost va y.equals(z) ham rost qaytarsa , x.equals(z) true ni qaytarishi kerak .

  • izchillik - har qanday x va y qiymatlari uchun x.equals(y) ga takroriy qo'ng'iroq har doim ushbu usulga oldingi qo'ng'iroqning qiymatini qaytaradi, agar ikkita ob'ektni solishtirish uchun ishlatiladigan maydonlar qo'ng'iroqlar orasida o'zgarmagan bo'lsa. .

  • taqqoslash null - har qanday x qiymati uchun x.equals(null) ni chaqirish false ni qaytaradi .

98. Equals va HashCode ni bekor qilmasangiz nima bo'ladi?

Bunday holda, hashCode() berilgan ob'ekt saqlanadigan xotira joyiga qarab yaratilgan raqamni qaytaradi. Ya'ni, bir xil maydonlarga ega ikkita ob'ekt bekor qilinmagan hashCode() ga qo'ng'iroq qilganda turli qiymatlarni oladi (axir ular turli xil xotira joylarida saqlanadi). Unoverridden equals() bir xil ob'ektga ishora qiladimi yoki yo'qmi, havolalarni solishtiradi. Ya'ni, taqqoslash == orqali amalga oshiriladi va bir xil maydonlarga ega bo'lgan ob'ektlarda u har doim false ni qaytaradi . To'g'ri faqat bir xil ob'ektga havolalarni solishtirganda bo'ladi. Ba'zan bu usullarni bekor qilmaslikda mantiq bor. Misol uchun, siz ma'lum bir sinfning barcha ob'ektlari noyob bo'lishini xohlaysiz va bu usullarni bekor qilish faqat o'ziga xoslik mantig'ini buzadi. Asosiysi, bekor qilingan va bekor qilinmagan usullarning nuanslarini tushunish va vaziyatga qarab ikkala yondashuvni qo'llashdir.

99. Nima uchun simmetriya faqat x.equals(y) rost bo‘lsa, to‘g‘ri bo‘ladi?

Biroz g'alati savol. Agar A ob'ekt B ob'ektiga teng bo'lsa, u holda B ob'ekt A ob'ektiga teng bo'ladi. Agar B ob'ekt A ob'ektiga teng bo'lmasa, qanday qilib buning aksi mumkin? Bu oddiy mantiq. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  11-2-qism

100. HashCode-da to'qnashuv nima? U bilan qanday kurashish kerak?

HashCode to'qnashuvi ikki xil ob'ekt bir xil hashCode qiymatiga ega bo'lgan vaziyatdir . Bu qanday bo'lishi mumkin? Gap shundaki, xeshkod Integer turiga moslashtirilgan bo'lib , u o'z navbatida -2147483648 dan 2147483647 gacha bo'lgan diapazonga ega, ya'ni taxminan 4 milliard turli xil tamsayılar. Bu diapazon juda katta, ammo cheksiz emas. Shuning uchun, ikkita butunlay boshqa ob'ektlar bir xil xesh-kodga ega bo'lgan holatlar mumkin. Bu juda dargumon, ammo mumkin. Noto'g'ri amalga oshirilgan xesh funktsiyasi bir xil xesh kodlarining chastotasini oshirishi mumkin, bu, masalan, kichik diapazonda raqamlarni qaytaradi, bu esa to'qnashuv ehtimolini oshiradi. To'qnashuvga qarshi kurashish uchun siz hashCode usulini yaxshi qo'llashingiz kerak, shunda qiymatlarning tarqalishi maksimal bo'ladi va qiymatlarni takrorlash imkoniyati minimal bo'ladi.

101. HashCode shartnomasida ishtirok etuvchi element o'z qiymatini o'zgartirsa nima bo'ladi?

Agar xesh-kodni hisoblashda ishtirok etadigan element o'zgartirilgan bo'lsa, u holda ob'ektning o'zi ham o'zgartiriladi (agar xash funktsiyasi yaxshi bo'lsa). Shuning uchun HashMap da kalit sifatida o'zgarmas (o'zgarmas) ob'ektlardan foydalanish tavsiya etiladi, chunki ularning ichki holatini (maydonlarini) yaratilgandan keyin o'zgartirib bo'lmaydi. Shunga ko'ra, ularning hash kodi ham yaratilgandan keyin aylantirilmaydi. Agar siz kalit sifatida o'zgaruvchan ob'ektdan foydalansangiz, ushbu ob'ektning maydonlarini o'zgartirganingizda, uning xesh kodi o'zgaradi va natijada siz HashMap- da bu juftlikni yo'qotishingiz mumkin . Axir, u asl xesh-kod uchun chelakda saqlanadi va uni o'zgartirgandan so'ng, u boshqa chelakda qidiriladi. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  11-3-qism

102. String name va int age maydonlaridan tashkil topgan Student sinfi uchun Equals va HashCode usullarini yozing.

public class Student {
int age;
String name;

 @Override
 public boolean equals(final Object o) {
   if (this == o) {
     return true;
   }
   if (o == null || this.getClass() != o.getClass()) {
     return false;
   }

   final Student student = (Student) o;

   if (this.age != student.age) {
     return false;
   }
   return this.name != null ? this.name.equals(student.name) : student.name == null;
 }

 @Override
 public int hashCode() {
   int result = this.age;
   result = 31 * result + (this.name != null ? this.name.hashCode() : 0);
   return result;
 }
}
Teng:
  • Birinchidan, biz havolalarni to'g'ridan-to'g'ri solishtiramiz, chunki agar havolalar bir xil ob'ektga tegishli bo'lsa, tekshirishni davom ettirishning nima keragi bor? Baribir hammasi haqiqat bo'ladi .

  • Null va mos sinf turlarini tekshirish, chunki agar ob'ekt null yoki boshqa turdagi argument bo'lsa, bu ob'ektlar teng emasligini anglatadi - false .

  • Argument ob'ektini bitta turga o'tkazish (agar u asosiy turdagi ob'ekt bo'lsa).

  • Ibtidoiy sinf maydonini taqqoslash (oxirda =! orqali taqqoslash kifoya ), agar maydon teng bo'lmasa - noto'g'ri .

  • Non va tenglar uchun primitiv bo'lmagan maydonni tekshirish ( Stringda usul bekor qilingan va to'g'ri taqqoslanadi), agar ikkala maydon null yoki teng bo'lsa , tekshirish tugaydi va usul true qiymatini qaytaradi .

Hashkod:
  • Dastlabki xesh-kod qiymatini ob'ektning yoshi primitiviga o'rnatish .

  • Joriy xesh kodini 31 ga ko'paytirish (ko'proq tarqalish uchun) va unga ibtidoiy bo'lmagan satr maydonining xesh kodini qo'shish (agar u null bo'lmasa).

  • Natijani qaytarish.

  • Ushbu xesh-kodni bekor qilish natijasida bir xil nom va int qiymatlariga ega ob'ektlar har doim bir xil qiymatni qaytaradi.

103. If (obj instanceof Student) va if (getClass() == obj.getClass()) dan qanday farq bor?

Keling, har bir yondashuv nima qilishini ko'rib chiqaylik:
  • instanceof chap tomondagi ob'ekt havolasi o'ng tomondagi turdagi namuna yoki uning ayrim kichik turi ekanligini tekshiradi.

  • getClass() == ... tur identifikatorini tekshiradi.

Ya'ni, agar getClass() sinfning to'liq identifikatorini tekshirsa, instanceof ob'ekt faqat kichik tip bo'lsa ham haqiqatni qaytaradi , bu polimorfizmdan faol foydalanishda bizga ko'proq moslashuvchanlikni beradi. Aslida, agar siz ularning ish xususiyatlarini tushunsangiz va ularni to'g'ri joylarda qo'llasangiz, ikkala yondashuv ham yaxshi.

104. Clon() usuliga qisqacha tavsif bering.

Clone() ob'ekt sinfining usuli bo'lib , uning maqsadi joriy ob'ektning (joriy ob'ektning nusxasi) klonini yaratish va qaytarishdir. Uni ishlatish uchun siz CloneableJava dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  11-4-qism marker interfeysini amalga oshirishingiz kerak :
Student implements Cloneable
Va clone() usulining o'zini bekor qiling :
@Override
protected Object clone() throws CloneNotSupportedException {
 return super.clone();
}
Axir, Object sinfida u himoyalangan, ya'ni u faqat Student sinfining o'zida ko'rinadi , lekin tashqaridan sinflarga ko'rinmaydi.

105. Malumot tipidagi ob'ekt maydonlari bilan ishlashning clone() usulining o'ziga xos xususiyati nimada?

Ob'ektlarni klonlashda faqat ibtidoiy qiymatlar va ob'ekt havolalarining qiymati ko'chiriladi. Bu shuni anglatadiki, agar ob'ektning ichki maydonida boshqa ob'ektga havola bo'lsa, u holda faqat shu havola klonlanadi, lekin bu boshqa ob'ektning o'zi klonlanmaydi. Aslida, ular buni sirt klonlash deb atashadi. Xo'sh, agar sizga barcha joylashtirilgan ob'ektlarni klonlash bilan to'liq huquqli klonlash kerak bo'lsa-chi? Bular havolalarning nusxalari emas, balki to'plamdagi boshqa egallab olingan xotira hujayralari bo'lgan ob'ektlarning to'liq huquqli klonlari ekanligiga qanday ishonch hosil qilish mumkin? Aslida, hamma narsa juda oddiy - buning uchun siz ushbu ichki ob'ektlarning har bir sinfidagi clone() usulini bekor qilishingiz va marker interfeysini qo'shishingiz kerak - Cloneable . Keyin ko'chiriladigan ob'ektlarga havolalar emas, balki ob'ektlarning o'zlari bo'ladi, chunki endi ular ham o'zlarini nusxalash imkoniyatiga ega.

Istisnolar

106. Xato va istisno o'rtasidagi farq nima?

Istisnolar ham, xatolar ham Throwable sinfining pastki sinflaridir . Biroq, ularning farqlari bor. Xato, asosan, tizim resurslarining etishmasligi tufayli yuzaga keladigan muammoni ko'rsatadi. Va bizning ilovamiz bunday muammolarni aniqlamasligi kerak. Xatolarning ba'zi misollari tizimning ishdan chiqishi va xotirada xatolikdir. Xatolar asosan ish vaqtida yuzaga keladi, chunki ular tekshirilmagan turdagi. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  11-5-qismIstisnolar ish vaqtida va kompilyatsiya vaqtida yuzaga kelishi mumkin bo'lgan muammolardir. Odatda bu ishlab chiquvchilar tomonidan yozilgan kodda sodir bo'ladi. Ya'ni, istisnolar ko'proq prognoz qilinadigan va ishlab chiquvchilar sifatida bizga ko'proq bog'liq. Shu bilan birga, xatolar ko'proq tasodifiy va bizdan ko'proq mustaqildir, aksincha, bizning ilovamiz ishlaydigan tizimning o'zi bilan bog'liq muammolarga bog'liq.

107. Belgilangan va belgilanmagan, istisno, otish, uloqtirish o'rtasidagi farq nima.

Yuqorida aytib o'tganimdek, istisno bu dasturni bajarish paytida va ishlab chiquvchi tomonidan yozilgan kodda (ba'zi g'ayritabiiy vaziyat tufayli) yuzaga kelgan kompilyatsiya paytida xatolikdir. Belgilangan - bu har doim try-catch mexanizmi yordamida ishlov berilishi yoki yuqoridagi usullarga kiritilishi kerak bo'lgan istisno turi . Usul sarlavhasida "throws" qo'llaniladi, bu usul tomonidan tashlangan mumkin bo'lgan istisnolarni ko'rsatish uchun. Ya'ni, bu yuqoridagi usullarga istisnolarni "tashlash" mexanizmi. Belgilanmagan istisno turi bo'lib, uni qayta ishlashga hojat yo'q va odatda oldindan aytib bo'lmaydigan va yuzaga kelish ehtimoli kamroq. Biroq, agar xohlasangiz, ular ham qayta ishlanishi mumkin. Throw istisnoni qo'lda tashlashda ishlatiladi, masalan:
throw new Exception();

108. Istisnolar ierarxiyasi nima?

Istisnolar ierarxiyasi juda katta va keng, hatto bu erda hamma narsani aytib berish uchun juda keng. Shuning uchun biz faqat uning asosiy bo'g'inlarini ko'rib chiqamiz: Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  11-6-qismBu erda ierarxiyaning eng yuqori qismida biz sinfni ko'ramiz - Throwable - umumiy sinf, istisno ierarxiyasining ajdodi, u o'z navbatida quyidagilarga bo'linadi:
  • Xato - tanqidiy, tekshirib bo'lmaydigan xatolar.
  • Istisno - tekshirilgan istisnolar.
Istisno turli xil tekshirilmagan ish vaqti istisnolari va har xil tekshirilgan istisnolarga bo'linadi.

109. Belgilangan va belgilanmagan istisno nima?

Avval aytganimdek:
  • Belgilangan - siz qandaydir tarzda hal qilishingiz kerak bo'lgan istisnolar, ya'ni ularni sinab ko'rish blokida qayta ishlang yoki ularni yuqoridagi usulga "yo'naltiring". Buning uchun usul imzosida, usul argumentlarini sanab o'tgandan so'ng, siz trows <istisno turi> kalit so'zidan foydalanishingiz kerak , bu usul foydalanuvchilariga ushbu istisnoni (ogohlantirish kabi bir narsa) tashlashi mumkinligini ko'rsatadi va ushbu usul foydalanuvchilari uchun istisnolarni hal qilish uchun javobgarlik.

  • Belgilanmagan - ishlov berishni talab qilmaydigan istisnolar, chunki ular kompilyatsiya vaqtida tekshirilmaydi va qoida tariqasida oldindan aytib bo'lmaydi. Ya'ni, tekshirilgandan asosiy farq shundaki, ular uchun bu sinash yoki otish mexanizmlari bir xil ishlaydi, ammo ular majburiy emas.

101. Usulning try-catch blokidagi istisnoni ushlab turish va ishlov berishga misol yozing.

try{                                                 // начало блока перехвата
 throw new Exception();                             // ручной бросок исключения
} catch (Exception e) {                              // данное исключение и его потомки будут перехватываться
 System.out.println("Упс, что-то пошло не так =("); // вывод некоторого исключения в консоль
}

102. O'zingizning istisnolaringizdan foydalanib, istisnoni ushlash va boshqarishga misol yozing

Birinchidan, Exception -dan meros bo'lib , konstruktorini xato xabari bilan bekor qiladigan o'z istisno sinfimizni yozamiz :
public class CustomException extends Exception {

 public CustomException(final String message) {
   super(message);
 }
}
Xo'sh, biz uni qo'lda tashlaymiz va oldingi savolda bo'lgani kabi tutib olamiz:
try{
 throw new CustomException("Упс, что-то пошло не так =(");
} catch (CustomException e) {
 System.out.println(e.getMessage());
}
Va yana, uni ishga tushirganingizda, konsolga quyidagi natijani olasiz:
Nimadir xato ketdi =(
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11 - 7Bu erda istisnolar haqida ko'proq ma'lumot olishingiz mumkin . Xo'sh, bugun hammasi shu! Keyingi qismda ko'rishguncha!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION