JavaRush /Блоги Java /Random-TG /Қиссаи як мусоҳиба: саволҳои ҷолиб
GuitarFactor
Сатҳи
Санкт-Петербург

Қиссаи як мусоҳиба: саволҳои ҷолиб

Дар гурӯҳ нашр шудааст
Ба наздикӣ ман имкон пайдо кардам, ки дар мусоҳиба барои коромӯзӣ дар яке аз ширкатҳои бузурги IT ширкат кунам. Қиссаи як мусоҳиба: саволҳои ҷолиб - 1Ин аввалин мусоҳибаи ман дар соҳаи IT буд ва ба андешаи ман, ҷолиб буд. Дар маҷмӯъ, маро зиёда аз 3 соат «пурсиш» карданд (ин пеш аз ин вазифаи хонагӣ ва санҷиш дар офис дар компютер буд). Мехоҳам ба мусоҳибае, ки ҳангоми ҷавоби нодуруст ба саволи худ ноумед нашуд, вале бо суолҳои роҳбараш маро маҷбур кард, ки дар ин бора андеша кунам ва ба ҷавоби дуруст оям. Дар зер ман якчанд «эскизҳо»-ро пешниҳод хоҳам кард - ба андешаи ман, саволҳои хеле ҷолиб, ки баъзеи онҳо ба ман фаҳмиши амиқтари ҷанбаҳои муайяни Java доданд. Шояд ин чизҳо барои баъзеҳо равшан ба назар мерасанд, аммо ман фикр мекунам, ки онҳое ҳастанд, ки ин барои онҳо муфид хоҳад буд. Дар зер ибораҳо бо ҳуруфҳои зерин таъкид шудаанд: Мусоҳиба - бо ғафс Тавзеҳҳои овозӣ ва андешаҳои ман - бо курсив Ҷавобҳои ман - бо ҳуруфи муқаррарӣ Мо замина анҷом додем, биёед ба кор сар кунем)

Эскиз 1. “Усули ба назар содда”

Бинависед, ки чӣ тавр шумо усулеро амалӣ мекунед, ки натиҷаи тақсими адади а ба ададро баргардонад. Мусоҳиба дар варақи коғаз менависад
int divide(int a, int b) {
}
*Ман нобоварона ба варақе, ки бо имзои методӣ навишта шудааст, нигоҳ кардам. Чй сайд?* Менависам:
int divide(int a, int b) {
    return a/b;
}
Оё бо ин усул ягон мушкилот вуҷуд дорад? *Ман як аблаҳи воқеан беақлро дастгир карда истодаам* Аз афташ не.. Баъдан саволи қонунӣ меояд: Агар b=0 бошад? *Ой, агар хамин тавр давом кунам, маро аз ин идора пеш карданй мешавам!* Оре, албатта. Дар ин ҷо мо далелҳои навъи int дорем, аз ин рӯ Истиснои арифметикӣ партофта мешавад. Агар аргументҳо навъи float ё double бошад, натиҷа Infinity хоҳад буд. Мо дар ин бора чӣ кор хоҳем кард? Ман ба навиштани кӯшиш/сайд шурӯъ мекунам
int divide(int a, int b) {
    try {
        return a/b;
    } catch (Exception e) {
        e.printStackTrace();
        return ... // ??? what the hack?
    }
}
*Ман бармегардам ва ях мекунам: дар сурати хато чизе бояд баргардонида шавад. Аммо ин «чизе»-ро аз натичаи хисоб чй тавр фарк кардан мумкин аст?* Мо чй бармегардем? Ҳм... Ман навъи тағирёбандаи бозгаштро ба Integer иваз мекардам ва дар ҳолати истисно ман нулро бармегардонам. Биёед тасаввур кунем, ки мо навъи онро тағир дода наметавонем. Оё мо метавонем бо ягон роҳ берун шавем? Шояд мо ба истиснои кор чизи дигаре кунем? *Инак меояд* Мо инчунин метавонем онро ба усули занг равон кунем! Дуруст. Он чӣ гуна хоҳад буд?
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();
    }
}
Оё истисноро ҳал кардан лозим аст? Бале, зеро мо онро ба таври возеҳ аз усули тақсимот интиқол медиҳем. (*Ман дар ин ҷо иштибоҳ кардам! Саволҳои зерини мусоҳиб барои расидан ба ҷавоби дуруст кадомҳоянд*) Ва Истиснои арифметикӣ - ин чӣ гуна истисно аст - санҷидашуда ё бидуни қайд? Ин истиснои Runtime аст, ки маънои санҷидашударо дорад. *Дар ин ҷо саволи қотил меояд* Пас маълум мешавад, ки ба ибораи шумо, агар мо дар имзои метод истиснои арифметикиро нишон диҳем, пас он истиснои тафтишшуда шудааст? *Уф!* Шояд... не. Бале, нашуд. Агар мо дар имзо партофтан /истиснои бетаъсир/-ро нишон диҳем, мо танҳо ҳушдор медиҳем, ки усул метавонад истисноро партояд, аммо коркарди он дар усули занг шарт нест. Ин тартиб дода шудааст. Оё кори дигаре ҳаст, ки мо метавонем аз хатогиҳо пешгирӣ кунем? *Баъд аз андеша* Бале, мо инчунин метавонем тафтиш кунем, ки оё (b==0). Ва баъзе мантиқро иҷро кунед. Дуруст. Пас, мо метавонем бо 3 роҳ равем:
  • кӯшиш кунед / сайд кунед
  • партофт - интиқол ба усули занг
  • тафтиши аргумент
Дар ин маврид divideкадом усулро афзалтар мешуморед?
Ман интихоб мекунам, ки истисноро ба усули занг интиқол диҳам, зеро... дар усули тақсим маълум нест, ки чӣ тавр коркарди ин истисно ва кадом намуди натиҷа intдар сурати хатогӣ баргардонида мешавад. Ва дар усули занг, ман аргументи b-ро истифода мебарам, то ки оё он ба сифр баробар бошад. Чунин ба назар мерасад, ки ин ҷавоб мусоҳибаро қаноатманд кард, аммо ростӣ, ман боварӣ надорам, ки ин ҷавоб якхела аст))

Эскиз 2. «Кӣ тезтар аст?»

Пас аз саволи стандартӣ, чӣ гуна ArrayList аз LinkedList фарқ мекунад, чунин омад: Чӣ тезтар мешавад - ворид кардани элемент ба мобайн ArrayListё ба миёна LinkedList? *Дар ин ҷо ман паридаам, ба ёд овардам, ки дар ҳама ҷо чизе хонда будам, ба монанди " LinkedListбарои дохил кардан ё хориҷ кардани элементҳо дар мобайни рӯйхат истифода баред". Дар хона ман ҳатто лексияҳои JavaRush-ро дубора тафтиш кардам, иборае ҳаст: “агар шумо ба мобайни коллексия элементҳои зиёде дохил карданӣ бошед (ё нест кунед), пас беҳтараш -ро истифода баред LinkedList. Дар ҳама ҳолатҳои дигар - ArrayList. Ба таври худкор ҷавоб дод* Он бо LinkedList. Лутфан равшан кунед
  1. Барои ворид кардани элемент дар мобайн ArrayList, мо элементро дар рӯйхат дар вақти доимӣ пайдо мекунем ва сипас шохиси элементҳои дар тарафи рости воридшуда дар вақти хаттӣ аз нав ҳисоб мекунем.
  2. Барои LinkedList.. Мо аввал дар вақти хатӣ ба миёна мерасем ва сипас дар вақти доимӣ як элементро ворид мекунем, пайвандҳоро барои унсурҳои ҳамсоя иваз мекунем.
Пас маълум мешавад, ки кадомаш тезтар аст? Хм... Хамин тавр мешавад. Аммо кай тезтар аст LinkedList? Маълум мешавад, ки вакте ки онро ба нимаи аввали руйхат дохил мекунем. Масалан, агар шумо онро дар аввал гузоред, шумо ArrayListбояд ҳамаи индексҳоро то дум дубора ҳисоб кунед, аммо шумо LinkedListтанҳо бояд истинод ба элементи якумро тағир диҳед. Ахлоқ: ба ҳама чизе, ки навишта шудааст, ҳатто дар JavaRush бовар накунед!)

Эскиз 3. "Мо бе баробарҳо ва хэшcode куҷо мешудем!"

Суҳбат дар бораи баробар ва hashcode хеле тӯлонӣ буд - чӣ гуна онро аз байн бурдан мумкин аст, чӣ гуна татбиқ дар Object, дар зери сарпӯш чӣ мешавад, вақте ки элемент ба HashMap. Факат як катор нуктахоеро баён мекунам, ки ба назари ман шавковаранд* Тасаввур кунед, ки мо синф ташкил кардем
public class A {
    int id;

    public A(int id) {
        this.id = id;
    }
}
Ва онҳо барҳам надоданд equalsва hashcode. Тавсиф кунед, ки ҳангоми иҷро кардани code чӣ рӯй медиҳад
A a1 = new A(1);
A a2 = new A(1);
Map<A, String> hash = new HashMap<>();
hash.put(a1, "1");
hash.get(a2);
*Хуб аст, ки пеш аз мусоҳиба ман чанд рӯзро барои фаҳмидани алгоритмҳои асосӣ, мураккабии онҳо ва сохторҳои додаҳо сарф кардам - ​​ин бисёр кӯмак кард, ташаккур CS50!*
  1. Ду мисоли синфи А эҷод кунед

  2. Мо харитаи холӣ месозем, ки дар он 16 сабад мавҷуд аст. Калид an objectи синфи А мебошад, ки дар он equalsва усулҳо бекор карда намешаванд hashcode.

  3. a1Онро дар харита гузоред . Барои ин, мо аввал ҳисоб кардани hash a1.

    Хаш ба чӣ баробар хоҳад буд?

    Суроғаи ячейка дар хотира амалисозии метод аз синф мебошадObject

  4. Дар асоси хэш, мо индекси сабадро ҳисоб мекунем.

    Чӣ тавр мо метавонем онро ҳисоб кунем?

    *Мутаассифона, ман дар ин чо чавоби аник надодам. Шумо рақами дароз доред - ҳаш, ва 16 сатил вуҷуд дорад - индексро чӣ гуна бояд муайян кард, то an objectҳои дорои хэшҳои гуногун дар байни сатилҳо баробар тақсим карда шаванд? Ман тасаввур карда метавонам, ки индекс чунин ҳисоб карда мешавад:

    int index = hash % buckets.length

    Аллакай дар хона ман дидам, ки татбиқи аслӣ дар codeи сарчашма каме фарқ мекунад:

    static int indexFor(int h, int length)
    {
        return h & (length - 1);
    }
  5. Мо тафтиш мекунем, ки ягон бархӯрд вуҷуд надорад ва a1-ро ворид кунед.

  6. Биёед ба усул мегузарем get. Мисолҳои a1 ва a2 кафолат дода мешаванд, ки дорои hashсуроғаҳои гуногун (дар хотира) мебошанд, бинобар ин мо барои ин калид чизе намеёбем

    Чӣ мешавад, агар мо онро танҳо hashcodeдар синфи А аз нав муайян кунем ва кӯшиш кунем, ки ба хэшмап аввал ҷуфт бо калиди a1 ва баъд бо a2 ворид кунем?

    Пас, аввал мо сабади дилхоҳро аз ҷониби пайдо мекунем hashcode- ин амалиёт дуруст иҷро карда мешавад. Минбаъд, биёед аз an objectҳои Entryдар LinkedList ба ароба замимашуда гузаред ва калидҳоро аз рӯи equals. Зеро equalsаст, бекор карда намешавад, он гоҳ татбиқи базавӣ аз синф гирифта мешавад Object- муқоиса бо истинод. a1 ва a2 кафолат дода мешавад, ки истинодҳои гуногун дошта бошанд, аз ин рӯ, мо унсури воридшуда a1 -ро "пазмон" хоҳем кард ва a2 дар LinkedList ҳамчун гиреҳи нав ҷойгир карда мешавад.

    Хулоса чист? Оё мумкин аст, ки ҳамчун калид дар HashMapan objectе, ки аз эътибор соқит нашудааст, истифода шавад equalshashcode?

    Не, шумо наметавонед.

Эскиз 4. «Биёед онро дидаю дониста вайрон кунем!».

Пас аз саволҳо дар бораи Хато ва Истисно, саволи зерин пайдо шуд: Мисоли оддӣ нависед, ки функсия StackOverflow-ро мепартояд. *Баъд ман ба ёд овардам, ки чӣ гуна ин хато ҳангоми кӯшиши навиштани ягон функсияи рекурсивӣ маро азоб медод* Ин эҳтимол дар сурати занги рекурсивӣ рӯй медиҳад, агар шарти баромадан аз рекурсия нодуруст муайян карда шуда бошад. *Баъд ман ба кӯшиши як чизи оқилона шурӯъ кардам, дар ниҳоят мусоҳиба кӯмак кард, ҳама чиз оддӣ шуд*
void sof() {
    sof();
}
Ин хато аз чӣ фарқ дорад OutOfMemory? *Ман дар ин ҷо ҷавоб надодам, танҳо баъдтар фаҳмидам, ки ин савол дар бораи дониши хотираи Java аст Stack( Heapзангҳо ва истинодҳо ба an objectҳо дар Stack нигоҳ дошта мешаванд ва худи an objectҳо дар хотираи Heap нигоҳ дошта мешаванд). Мувофиқи он, StackOverflow вақте хориҷ карда мешавад, вақте ки дар хотира барои занги усули навбатӣ ҷой холӣ нест Stackва OutOfMemoryҷой барои an objectҳо дар хотира тамом шудааст Heap*
Ин лахзахо аз мусохиба ба ёдам меояд. Дар охир маро ба таҷрибаомӯзӣ қабул карданд, аз ин рӯ ман дар пеш 2,5 моҳи омӯзиш ва агар ҳамааш хуб бошад, дар корхона коре дорам) Агар шавқ пайдо шавад, ман метавонам мақолаи дигаре нависам, ин дафъа хурдтар, бо таҳлor як масъалаи оддӣ, вале тасвирӣ, ки ман дар як ширкати дигар мусоҳиба дода шудаам. Ин ҳама барои ман аст, ман умедворам, ки ин мақола ба касе кӯмак мекунад, ки дониши худро амиқтар кунад ё ташкил кунад. Омузиши ҳама муборак!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION