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

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

Guruhda nashr etilgan
Salom do'stim! Dasturchi bo'lish uchun qancha vaqt ketadi? Men juda ko'p odamlardan so'radim va juda ko'p turli xil javoblarni eshitdim. Ba'zilar uchun bir oy ham etarli bo'lishi mumkin, ammo boshqalar uchun bir yil ham etarli emas. Lekin men aniq bilamanki, Java dasturchisi bo'lish sizning boshlang'ich qobiliyatingizdan qat'i nazar, mashaqqatli va uzoq yo'ldir. Axir, qobiliyat emas, balki qaysarlik va mehnatsevarlik muhim ahamiyatga ega. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-1-qismShuning uchun, bugungi kunda biz Java dasturchisi uchun eng mashhur intervyu savollarini maqsadli tahlil qilishda davom etamiz. Ularni o'rganish sizni asta-sekin o'z oldingizga qo'ygan maqsadingizga yaqinlashtiradi. Qani boshladik!

17. Majburiy emasdan muvaffaqiyatli va muvaffaqiyatsiz foydalanishga misollar keltiring

Aytaylik, bizda ma'lum bir qator qiymatlar bor, ular orqali biz oqim orqali o'tamiz va natijada biz ixtiyoriy bo'lamiz :
Optional<String> stringOptional = Stream.of("a", "ab", "abc", "abcd")
   .filter(str -> str.length() >= 3)
   .findAny();
Biz kutilganidek, ushbu ixtiyoriy dan qiymat olishimiz kerak . Faqat get() dan foydalanish yomon yo'ldir:
String result = stringOptional.get();
Ammo bu usul ixtiyoriydan qiymatni olishi va uni bizga qaytarishi kerakmi? Bu, albatta, to'g'ri, lekin agar u ma'noga ega bo'lsa. Agar oqimdagi qiymatlar boshqacha bo'lsa va oxirida biz bo'sh Optional ni olgan bo'lsak, get() usuli yordamida undan qiymat olishga harakat qilganimizda , quyidagilar tashlanadi: Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-2-qismBu yaxshi emas. Bunday holda, quyidagi konstruktsiyalardan foydalanish yaxshiroqdir:
  1. String result = null;
    if (stringOptional.isPresent()) {
     stringOptional.get();
    }

    Bunday holda, biz elementning Majburiy emasligini tekshiramiz . Agar yo'q bo'lsa, natijada olingan satr o'zining eski qiymatiga ega bo'ladi.

  2. String result = stringOptional.orElse("default value");

    Bunday holda, biz ba'zi bir sukut bo'yicha qiymatni belgilaymiz, bu bo'sh bo'lsa, natijada paydo bo'lgan satrga beriladi Opsiyonel .

  3. String result = stringOptional.orElseThrow(() -> new CustomException());

    Bunday holda, Opsiyonel bo'sh bo'lganda, biz o'zimiz istisno qilamiz .

Bu, masalan, Spring JPA usuli ishlatilganda, ilovada qulay bo'lishi mumkin - findById() , ixtiyoriy qiymatlarni qaytaradi . Bunday holda, ushbu usul yordamida biz qiymatni olishga harakat qilamiz va agar u mavjud bo'lmasa, biz ExceptionHandler yordamida kontroller darajasida qayta ishlanadigan va 404 - TOPILMAYDI holati bilan HTTP javobiga aylantiriladigan ba'zi Runtime istisnolarini tashlaymiz . Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-3-qism

18. Asosiy usulni yakuniy deb e'lon qilish mumkinmi?

Ha, albatta, asosiy() usulini final deb e'lon qilishimizga hech narsa to'sqinlik qilmaydi . Kompilyator xatolikka yo'l qo'ymaydi. Ammo shuni esda tutish kerakki, har qanday usul uni yakuniy deb e'lon qilgandan keyin oxirgi usul bo'ladi - bekor qilinmaydi. Garchi asosiyni kim qayta aniqlaydi ??? Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-4-qism

19. Xuddi shu paketni/sinfni ikki marta import qilish mumkinmi? Buning oqibatlari qanday bo'lishi mumkin?

Ha mumkin. Oqibatlari? Bizda Intelijj IDEA kulrang rangda ko'rsatiladigan bir nechta keraksiz importlar bo'ladi, ya'ni. foydalanilmagan. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-5-qismJava dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-6-qism

20. Kasting nima? ClassCastExceptionni qachon olishimiz mumkin?

Kasting yoki turdagi casting - bu ma'lumotlarning bir turini boshqa ma'lumotlar turiga o'zgartirish jarayoni: qo'lda (yoshiq translatsiya) yoki avtomatik ravishda (aniq turdagi translyatsiya). Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-7-qismAvtomatik konvertatsiya kompilyator tomonidan, qo'lda konvertatsiya esa ishlab chiquvchi tomonidan amalga oshiriladi. Primitivlar va sinflar uchun turdagi kasting biroz boshqacha, shuning uchun biz ularni alohida ko'rib chiqamiz. Ibtidoiy turlar Ibtidoiy turlarni avtomatik quyish misoli :
int value = 17;
double convertedValue = value;
Ko'rib turganingizdek, bu erda = belgisidan boshqa qo'shimcha manipulyatsiyalar kerak emas. Ibtidoiy turlarni qo'lda quyish misoli :
double value = 17.89;
int convertedValue = (int)value;
Bunday holda, (int) yordamida amalga oshiriladigan qo'lda quyishni kuzatishimiz mumkin , bunda verguldan keyingi qism o'chiriladi va convertedValue qiymati - 17 ga teng bo'ladi. Ushbu maqolada ibtidoiy turlarni quyish haqida ko'proq o'qing . Xo'sh, endi ob'ektlarga o'tamiz. Malumot turlari Malumot turlari uchun avlod sinflari uchun ota-sinflarga avtomatik taqsimlash mumkin. Bu polimorfizm deb ham ataladi . Aytaylik, bizda Cat sinfidan meros qolgan Lion sinfi bor . Bunday holda, avtomatik konvertatsiya quyidagicha ko'rinadi:
Cat cat = new Lion();
Ammo aniq cast bilan hamma narsa biroz murakkabroq, chunki ibtidoiylar kabi ortiqcha narsalarni kesish uchun hech qanday funksionallik yo'q. Va faqat shaklni aniq konvertatsiya qilish:
Lion lion= (Lion)new Cat();
Siz xatoga duch kelasiz: Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-8-qismaslida siz Cat sinfida bo'lmagan Lion avlod sinfiga usullarni qo'shishingiz mumkin va keyin ularni chaqirishga urinib ko'rishingiz mumkin, chunki sizning ob'ekt turi Lion ga aylanadi . Xo'sh, bunda hech qanday mantiq yo'q. Shuning uchun, turdagi toraytirish faqat asl ob'ekt Lion tipidagi bo'lsa, lekin keyinchalik ota-sinfga o'tkazilganda mumkin:
Lion lion = new Lion();
Cat cat = lion;
Lion newLion = (Lion)cat;
Bundan tashqari, yuqori ishonchlilik uchun instanceOf konstruksiyasidan foydalanib, ob'ektlar uchun toraytirish tavsiya etiladi :
if (cat instanceof Lion) {
 newLion = (Lion)new Cat();
}
Ushbu maqolada mos yozuvlar turini quyish haqida ko'proq o'qing .

21. Nima uchun zamonaviy ramkalar asosan faqat tekshirilmagan istisnolardan foydalanadi?

Menimcha, buning hammasi, chunki tekshirilgan istisnolardan foydalanish hali ham hamma joyda takrorlanadigan spagetti kodidir, lekin hamma hollarda ham kerak emas. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-9-qismBunday hollarda, buni yana bir bor ishlab chiquvchilarning yelkasiga o'tkazmaslik uchun ramka ichida ishlov berish osonroq bo'ladi. Ha, albatta, favqulodda vaziyat yuzaga kelishi mumkin, lekin xuddi shu tekshirilmagan istisnolarni try-catch- da ishlov berish bilan bezovta qilmasdan va ularni boshqa usullardan o'tkazmasdan qulayroq tarzda hal qilish mumkin . Istisnoni exceptionHandler da ba'zi HTTP javobiga aylantirish kifoya .

22. Statik import nima?

Statik ma'lumotlardan (usullar, o'zgaruvchilar) foydalanganda siz ob'ektni o'zi yaratolmaysiz, lekin uni sinf nomi bilan bajarasiz, lekin bu holatda ham bizga sinfga havola kerak. U bilan hamma narsa oddiy: u muntazam import yordamida qo'shiladi. Ammo sinf nomini yozmasdan, xuddi joriy sinfning statik usuli kabi statik usuldan foydalansak nima bo'ladi? Bu statik import bilan mumkin! Bunday holda, biz statik import va ushbu usulga havolani yozishimiz kerak. Masalan, kosinus qiymatini hisoblash uchun Math sinfining statik usuli:
import static java.lang.Math.cos;
Natijada, biz sinf nomini ko'rsatmasdan usuldan foydalanishimiz mumkin:
double result = cos(60);
Statik import yordamida bir vaqtning o'zida sinfning barcha statik usullarini oddiygina yuklashimiz mumkin:
import static java.lang.Math.*;
Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-10-qism

23. hashCode() va equals() usullari o'rtasida qanday bog'liqlik bor?

Oracle ga ko'ra , qoida quyidagicha: Agar ikkita ob'ekt teng bo'lsa (ya'ni, equals() usuli true qiymatini qaytarsa ), ular bir xil xesh kodiga ega bo'lishi kerak. Shu bilan birga, ikki xil ob'ekt bir xil xesh-kodga ega bo'lishi mumkinligini unutmang. Nima uchun equals() va hashCode() har doim juftlikda bekor qilinishini tushunish uchun quyidagi holatlarni ko'rib chiqing:
  1. Ikkala usul ham bekor qilingan.

    Bunday holda, bir xil ichki holatlarga ega bo'lgan ikki xil ob'ekt equals() - true ni qaytaradi , hashCode() esa bir xil raqamni qaytaradi.

    Ma'lum bo'lishicha, hamma narsa joyida, chunki qoidaga amal qilinmoqda.

  2. Ikkala usul ham bekor qilinmaydi.

    Bunday holda, bir xil ichki holatlarga ega bo'lgan ikki xil ob'ekt equals() bo'lganda false qiymatini qaytaradi , chunki taqqoslash == operatori orqali amalga oshiriladi .

    HashCode() usuli ham turli qiymatlarni qaytaradi (ehtimol), chunki u xotira manzilining o'zgartirilgan qiymatini ishlab chiqaradi. Ammo xuddi shu ob'ekt uchun bu qiymat bir xil bo'ladi, xuddi shunday bo'ladi, bu holda equals() faqat havolalar bir xil ob'ektga ishora qilganda haqiqiy bo'ladi.

    Ma'lum bo'lishicha, bu holatda hammasi joyida va qoida bajariladi.

  3. Overridden equals() , bekor qilingan hashCode() emas .

    Bunday holda, bir xil ichki holatlarga ega bo'lgan ikki xil ob'ekt uchun equals() true qiymatini qaytaradi va hashCode() har xil qiymatlarni qaytaradi (ehtimol).

    Bu qoida buzilishi, shuning uchun buni qilish tavsiya etilmaydi.

  4. equals() bekor qilinmagan , hashCode() bekor qilingan .

    Bunday holda, bir xil ichki holatlarga ega bo'lgan ikki xil ob'ekt uchun equals() false va hashCode() bir xil qiymatlarni qaytaradi .

    Qoidaning buzilishi mavjud, shuning uchun yondashuv noto'g'ri.

Ko'rib turganingizdek, qoida faqat equals() va hashCode() bekor qilinganda yoki ikkalasi ham bekor qilinmaganda bajarilishi mumkin. Ushbu maqolada equals() va hashCode()Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-11-qism haqida ko'proq o'qing .

24. BufferedInputStream va BufferedOutputStream sinflari qachon ishlatiladi?

InputStream ba'zi manbalardan ma'lumotlarni bayt-bayt o'qish uchun ishlatiladi va OutputStream ma'lumotlarni bayt-bayt yozish uchun ishlatiladi. Ammo bayt-bayt operatsiyalari juda noqulay bo'lishi mumkin va qo'shimcha ishlov berishni talab qiladi (matnlarni normal o'qish/yozish uchun). Aslida, bunday bayt yozuvlarini soddalashtirish uchun BufferedOutputStream va o'qish uchun BufferedInputStream joriy etildi . Bu sinflar ma'lumotlarni to'playdigan buferlardan boshqa narsa emas, bu sizga ma'lumotlar bilan bayt bo'yicha emas, balki butun ma'lumotlar paketlari (massivlar) bo'yicha ishlash imkonini beradi. Yaratilganda BufferedInputStream o'z konstruktoriga InputStream tipidagi misolni oladi , undan ma'lumotlar o'qiladi:
BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
byte[] arr = new byte[100];
bufferedInputStream.read(arr);
System.in - bu konsoldan ma'lumotlarni o'qiydigan InputStream ob'ekti. Ya'ni, ushbu BufferedInputStream ob'ektidan foydalanib , biz InputStream- dan ma'lumotlarni o'tkazilgan massivga yozish orqali o'qishimiz mumkin. Bu InputStream sinfining o'ziga xos o'rami bo'lib chiqadi . Ushbu misoldagi arr massivi BufferedInputStream dan ma'lumotlarni qabul qiluvchi massivdir . Bu, o'z navbatida, InputStream ma'lumotlarini sukut bo'yicha 2048 baytga ega bo'lgan boshqa massiv bilan o'qiydi. Xuddi shu narsa BufferedOutputStream uchun ham amal qiladi: OutputStream tipidagi namuna konstruktorga o'tkazilishi kerak , unga biz butun massivlarda ma'lumotlarni yozamiz:
byte[] arr = "Hello world!!!".getBytes();
BufferedOutputStream bufferedInputStream = new BufferedOutputStream(System.out);
bufferedInputStream.write(arr);
bufferedInputStream.flush();
System.out - bu konsolga ma'lumotlarni yozadigan OutputStream ob'ekti. flush() usuli BufferedOutputStream dan ma'lumotlarni OutputStream ga yuboradi va jarayonda BufferedOutputStreamni tozalaydi . Ushbu usulsiz hech narsa yozilmaydi. Va oldingi misolga o'xshash: arr - BufferedOutputStream ga ma'lumotlar yoziladigan massiv . U yerdan ular OutputStream- ga sukut bo'yicha 512 bayt hajmga ega bo'lgan boshqa massivda yoziladi . Ushbu ikki sinf haqida ko'proq maqolada o'qing .

25. Java.util.Collection va java.util.Collections sinflarining farqi nimada?

To'plam - bu to'plam ierarxiyasining boshi bo'lgan interfeys. U barcha ob'ektlar guruhlarini yaratish, o'z ichiga olish va o'zgartirish imkonini beruvchi sinflarni taqdim etadi. Buning uchun add() , remove() , contain() va boshqalar kabi ko'plab usullar mavjud . Collection sinfining asosiy interfeyslari :
  • To'plam - tartibsiz noyob (takrorlanmaydigan) elementlarni o'z ichiga olgan to'plamni tavsiflovchi interfeys.

  • Ro'yxat - ob'ektlarning tartiblangan ketma-ketligini saqlaydigan ma'lumotlar strukturasini tavsiflovchi interfeys. Ushbu ob'ektlar o'zlarining indekslarini (raqamlarini) oladilar, ular yordamida siz ular bilan o'zaro aloqada bo'lishingiz mumkin: olish, o'chirish, o'zgartirish, qayta yozish.

  • Navbat - FIFO - Birinchi kiruvchi birinchi chiqish qoidasiga amal qiladigan navbat ko'rinishidagi elementlarni saqlash bilan ma'lumotlar strukturasini tavsiflovchi interfeys .

Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-12-qismTo'plam haqida ko'proq o'qing . Collections - bu turli xil foydali usullarni ta'minlovchi yordamchi sinf. Masalan:
  • addAll(Collection<? super T> kolleksiyasi, T...element) - to'plamga o'tkazilgan T tipidagi elementlarni qo'shadi .

  • copy(List<? super T> dest, List<? extensions T> src) - barcha elementlarni src ro'yxatidan dest ro'yxatiga ko'chiradi .

  • emptyList() - bo'sh ro'yxatni qaytaradi.

  • max(To'plam<? T> to'plamni kengaytiradi, Komparator<? super T> komp) - Berilgan to'plamning maksimal elementini ko'rsatilgan taqqoslagich tomonidan belgilangan tartibda qaytaradi.

  • unmodifiableList(List<? T> ro'yxatini kengaytiradi) - o'tgan ro'yxatning o'zgartirilmaydigan ko'rinishini qaytaradi.

To'plamlarda bunday qulay usullar juda ko'p . Ushbu usullarning to'liq ro'yxatini Oracle veb-saytidaJava dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-13-qism topish mumkin . Ular qulay, deb bejiz aytmadim. Axir, ularning barchasi statikdir. Ya'ni, kerakli usulni chaqirish uchun har safar ushbu sinf ob'ektini yaratishingiz shart emas. Siz shunchaki sinf nomini kiritishingiz, unga kerakli usulni chaqirishingiz va barcha kerakli argumentlarni topshirishingiz kerak. Xulosa qilib aytadigan bo'lsak, Collection - bu kolleksiyalar ramkasining ildiz interfeysi. Collections - bu kollektsiyalar strukturasidagi turga tegishli ob'ektlarni yanada qulayroq qayta ishlash uchun yordamchi sinf. Xo'sh, bugun hammasi shu. Barcha ezgu tilaklarni tilayman!Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  16-14-qism
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION