JavaRush /Java blogi /Random-UZ /Bitta intervyu hikoyasi: qiziqarli savollar
GuitarFactor
Daraja
Санкт-Петербург

Bitta intervyu hikoyasi: qiziqarli savollar

Guruhda nashr etilgan
Yaqinda men yirik IT-kompaniyalardan birida stajyor lavozimi uchun intervyuda qatnashish imkoniga ega bo'ldim. Bitta intervyu hikoyasi: qiziqarli savollar - 1Bu mening birinchi IT suhbatim edi va menimcha, bu qiziqarli bo'ldi. Umuman olganda, men 3 soatdan ko'proq vaqt davomida "so'roqqa tutildim" (bundan oldin uy vazifasi va ofisda kompyuterda test o'tkazildi). Savolimga noto‘g‘ri javob berganimda ham taslim bo‘lmagan, lekin o‘zining yetakchi savollari bilan meni o‘ylashga va to‘g‘ri javobga kelishga majbur qilgan suhbatdoshni hurmat qilmoqchiman. Quyida men bir nechta "eskizlarni" taqdim etaman - mening fikrimcha, juda qiziqarli savollar, ulardan ba'zilari menga Java-ning ba'zi jihatlarini chuqurroq tushunishga imkon berdi. Ehtimol, bu narsalar ba'zilar uchun ravshan bo'lib tuyuladi, lekin menimcha, bu foydali bo'lganlar bo'ladi. Quyida iboralar quyidagi shriftlarda ta'kidlangan: Intervyu beruvchi - qalin ovozli tushuntirishlar va mening fikrlarim - kursivda Mening javoblarim - oddiy shriftda Fon bilan ishlash tugadi, keling, ishga kirishamiz)

Eskiz 1. "Oddiy ko'rinadigan usul"

a sonini b soniga bo'lish natijasini qaytaradigan usulni qanday amalga oshirishingizni yozing.Suhbatdosh qog'ozga yozadi .
int divide(int a, int b) {
}
*Usul imzosi tushirilgan qog‘ozga ishonmay qaradim. Gap nima?* Men yozaman:
int divide(int a, int b) {
    return a/b;
}
Ushbu usul bilan bog'liq muammolar bormi? *Men chindan ham ahmoq ahmoqni ushladim* Aftidan, yo'q.. Keyin qonuniy savol tug'iladi: agar b=0 bo'lsa-chi? *Voy, agar shunday davom etsam, meni bu idoradan haydab yuborishadi!* Ha, albatta. Bu erda bizda int tipidagi argumentlar mavjud, shuning uchun arifmetik istisno chiqariladi. Agar argumentlar float yoki double tipida bo'lsa, natija Infinity bo'ladi. Bu haqda nima qilmoqchimiz? Men try/catch yozishni boshlayapman
int divide(int a, int b) {
    try {
        return a/b;
    } catch (Exception e) {
        e.printStackTrace();
        return ... // ??? what the hack?
    }
}
*Men qaytib kelaman va muzlatib qo'yaman: xatolik yuz berganda biror narsa qaytarilishi kerak. Ammo bu «narsa»ni hisob-kitob natijasidan qanday ajratish mumkin?* Biz nimani qaytaramiz? Hm... Qaytish o'zgaruvchisining turini Integerga o'zgartirardim va istisno bo'lsa nullni qaytaraman. Tasavvur qilaylik, biz turni o'zgartira olmaymiz. Biz qandaydir tarzda tashqariga chiqa olamizmi? Balki biz bundan mustasno boshqa narsa qila olarmiz? *Mana keldi* Biz uni qo'ng'iroq qilish usuliga ham yuborishimiz mumkin! To'g'ri. U qanday ko'rinishga ega bo'ladi?
int divide(int a, int b) throws ArithmeticException{
    return a/b;
}

void callDivide(int a, int b) {
    try {
        divide(a, b);
    } catch (ArithmeticException e) {
        e.printStackTrace();
    }
}
Istisnoni hal qilish kerakmi? Ha, chunki biz uni ajratish usulidan aniq yo'naltiramiz. (*Men bu yerda xato qildim! Suhbatdoshning toʻgʻri javob topishga yordam beradigan savollari quyidagilardan iborat*) Va arifmetik istisno - bu qanday istisno - belgilangan yoki belgilanmagan? Bu Runtime istisnosi, ya'ni belgilanmagan. *Mana, qotil savol keladi* Shunday qilib, sizning so'zlaringiz bilan, agar biz imzo usulida arifmetik istisnoni ko'rsatsak, u tekshirilgan istisno bo'lib qoladimi? *Uf!* Balki... yo‘q. Ha, ketdi. Imzoda throws /belgilanmagan istisno/ ni ko'rsatsak, biz faqat usul istisnoni tashlashi mumkinligi haqida ogohlantiramiz, lekin uni chaqirish usulida ishlash shart emas. Bu tartibga solingan. Xatolarga yo'l qo'ymaslik uchun yana bir narsa qilishimiz mumkinmi? *Biroz o'ylab* Ha, (b==0) yoki yo'qligini ham tekshirishimiz mumkin. Va bir oz mantiqni bajaring. To'g'ri. Shunday qilib, biz 3 yo'l bilan borishimiz mumkin:
  • harakat qilib ko'ring/qo'lga oling
  • otadi - qo'ng'iroq qilish usuliga yo'naltirish
  • argumentlarni tekshirish
Bu holatda divideqaysi usul afzalroq deb o'ylaysiz?
Men istisnoni chaqiruv usuliga yo'naltirishni tanlagan bo'lardim, chunki ... intbo'lish usulida bu istisnoni qanday qayta ishlash va xatolik yuzaga kelganda qanday turdagi natijani qaytarish aniq emas . Va qo'ng'iroq qilish usulida men uning nolga tengligini tekshirish uchun b argumentidan foydalanardim. Bu javob suhbatdoshni qoniqtirganga o'xshaydi, lekin rostini aytsam, bu javob bir ma'noli ekanligiga ishonchim komil emas))

Eskiz 2. “Kim tezroq?”

Standart savoldan keyin ArrayList LinkedList dan qanday farq qiladi: nima tezroq sodir bo'ladi - elementni o'rtaga ArrayListyoki o'rtaga kiritish LinkedList? *Mana, men sakrab tushdim, men hamma joyda " LinkedListro'yxatning o'rtasiga elementlarni kiritish yoki olib tashlash uchun foydalaning" kabi narsalarni o'qiganimni esladim. Uyda men hatto JavaRush ma'ruzalarini ikki marta tekshirib ko'rdim, bir ibora bor: "agar siz to'plamning o'rtasiga ko'p elementlarni qo'shmoqchi bo'lsangiz (yoki o'chirmoqchi bo'lsangiz), undan foydalaning LinkedList. Boshqa barcha holatlarda - ArrayList." Avtomatik javob beradi* Bu bilan tezroq bo'ladi LinkedList. Iltimos, aniqlik kiriting
  1. Elementni o'rtasiga kiritish uchun ArrayListbiz ro'yxatdagi elementni doimiy vaqt ichida topamiz va keyin kiritilgan indeksning o'ng tomonidagi elementlarning indekslarini chiziqli vaqt ichida qayta hisoblaymiz.
  2. Uchun LinkedList.. Biz birinchi navbatda chiziqli vaqtda o'rtaga etib boramiz va keyin qo'shni elementlar uchun havolalarni o'zgartirib, doimiy vaqt ichida elementni kiritamiz.
Shunday qilib, qaysi biri tezroq? Hm... Xuddi shunday chiqadi. Lekin qachon LinkedListtezroq? Ma'lum bo'lishicha, biz uni ro'yxatning birinchi yarmiga kiritganimizda. Misol uchun, agar siz uni eng boshida kiritsangiz, siz ArrayListeng quyruqgacha bo'lgan barcha indekslarni qayta hisoblashingiz kerak bo'ladi, lekin siz LinkedListfaqat birinchi elementning havolasini o'zgartirishingiz kerak bo'ladi. Axloqiy: hatto JavaRush-da yozilgan hamma narsaga tom ma'noda ishonmang!)

Eskiz 3. “Tenglarsiz va xeshkodsiz qayerda bo'lardik!”

Tenglar va xeshkod haqida suhbat juda uzoq davom etdi - uni qanday bekor qilish kerak, qanday dastur mavjud Object, kaput ostida nima sodir bo'ladi, elementga element kiritilganda HashMapva hokazo. Men faqat bir qator qiziqarli fikrlarni keltiraman* Tasavvur qiling, biz sinf yaratdik
public class A {
    int id;

    public A(int id) {
        this.id = id;
    }
}
Va ular bekor qilmadi equalsva hashcode. Kod bajarilganda nima bo'lishini tasvirlab bering
A a1 = new A(1);
A a2 = new A(1);
Map<A, String> hash = new HashMap<>();
hash.put(a1, "1");
hash.get(a2);
*Suhbat oldidan men bir necha kun asosiy algoritmlarni, ularning murakkabligini va ma'lumotlar tuzilmalarini tushunishga sarflaganim yaxshi - bu juda ko'p yordam berdi, rahmat CS50!*
  1. A sinfining ikkita misolini yarating

  2. Biz bo'sh xaritani yaratamiz, unda sukut bo'yicha 16 savat mavjud. Kalit A sinfidagi ob'ekt bo'lib, unda equalsva usullari bekor qilinmaydi hashcode.

  3. a1Uni xaritaga qo'ying . Buning uchun birinchi navbatda hashni hisoblaymiz a1.

    Xesh nimaga teng bo'ladi?

    Xotiradagi katakning manzili sinfdan metodni amalga oshirishdirObject

  4. Xashga asoslanib, biz savat indeksini hisoblaymiz.

    Uni qanday hisoblashimiz mumkin?

    *Afsuski, men bu yerda aniq javob bermadim. Sizda uzun raqam bor - xesh va 16 chelak - turli xil xeshli ob'ektlar chelaklar bo'ylab teng taqsimlanishi uchun indeksni qanday aniqlash mumkin? Tasavvur qilishim mumkinki, indeks quyidagicha hisoblanadi:

    int index = hash % buckets.length

    Uyda allaqachon manba kodidagi asl dastur biroz boshqacha ekanligini ko'rdim:

    static int indexFor(int h, int length)
    {
        return h & (length - 1);
    }
  5. Biz to'qnashuvlar yo'qligini tekshiramiz va a1 ni kiritamiz.

  6. Keling, usulga o'tamiz get. hasha1 va a2 misollari boshqacha (xotirada boshqa manzil) bo'lishi kafolatlangan , shuning uchun biz bu kalit uchun hech narsa topa olmaymiz.

    Agar biz uni faqat hashcodeA sinfida qayta aniqlasak va xeshmapga avval a1 kaliti, keyin esa a2 tugmasi bilan juftlik kiritishga harakat qilsak-chi?

    Keyin avval biz kerakli savatni topamiz hashcode- bu operatsiya to'g'ri bajariladi. EntryKeyinchalik, savatga biriktirilgan LinkedList-dagi ob'ektlarni ko'rib chiqishni boshlaymiz va kalitlarni bo'yicha solishtiramiz equals. Chunki equalsbekor qilinmaydi, keyin asosiy amalga oshirish sinfdan olinadi Object- mos yozuvlar bo'yicha taqqoslash. a1 va a2 turli havolalarga ega bo'lishi kafolatlanadi, shuning uchun biz kiritilgan a1 elementini "o'tkazib yuboramiz" va a2 LinkedList-ga yangi tugun sifatida joylashtiriladi.

    Xulosa nima? HashMapQayta belgilanmagan ob'ektda kalit sifatida foydalanish mumkinmi equalshashcode?

    Mumkin emas.

4-chizma. “Qasddan buzaylik!”

Xato va istisnolar haqidagi savollardan so'ng quyidagi savol tug'ildi: Funktsiya StackOverflowni tashlaydigan oddiy misolni yozing. *Keyin men qandaydir rekursiv funktsiyani yozishga urinayotganimda bu xato meni qanday qiynaganini esladim* Bu rekursiv chaqiruvda, rekursiyadan chiqish sharti noto'g'ri ko'rsatilgan bo'lsa, ehtimol sodir bo'ladi. *Keyin men aqlli narsani sinab ko'ra boshladim, oxirida suhbatdosh yordam berdi, hamma narsa oddiy bo'lib chiqdi*
void sof() {
    sof();
}
Bu xato qanday farq qiladi OutOfMemory? *Men bu yerda javob bermadim, keyinroq tushundimki, bu savol Java xotirasini bilish Stack( Heapqo'ng'iroqlar va ob'ektlarga havolalar Stackda saqlanadi, ob'ektlarning o'zi esa yig'ma xotirada saqlanadi). StackShunga ko'ra, keyingi usul chaqiruvi uchun xotirada bo'sh joy qolmaganda va OutOfMemoryob'ektlar uchun bo'sh joy tugasa , StackOverflow o'chiriladi Heap*
Bu suhbatdan esimda qolgan lahzalar. Oxir-oqibat, meni amaliyotga qabul qilishdi, shuning uchun meni oldinda 2,5 oylik mashg'ulot va agar hamma narsa yaxshi bo'lsa, kompaniyada ish bor) Agar qiziqish bo'lsa, men boshqa maqola yozishim mumkin, bu safar kichikroq, Menga boshqa kompaniyada intervyu berilgan oddiy, ammo illyustrativ muammoning tahlili. Hammasi men uchun, umid qilamanki, ushbu maqola kimgadir bilimini chuqurlashtirishga yoki tartibga solishga yordam beradi. Hammaga o'qish baxti!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION