Эскиз 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
. Лутфан равшан кунед
- Барои ворид кардани элемент дар мобайн
ArrayList
, мо элементро дар рӯйхат дар вақти доимӣ пайдо мекунем ва сипас шохиси элементҳои дар тарафи рости воридшуда дар вақти хаттӣ аз нав ҳисоб мекунем. - Барои
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!*
-
Ду мисоли синфи А эҷод кунед
-
Мо харитаи холӣ месозем, ки дар он 16 сабад мавҷуд аст. Калид an objectи синфи А мебошад, ки дар он
equals
ва усулҳо бекор карда намешавандhashcode
. -
a1
Онро дар харита гузоред . Барои ин, мо аввал ҳисоб кардани hasha1
.Хаш ба чӣ баробар хоҳад буд?
Суроғаи ячейка дар хотира амалисозии метод аз синф мебошад
Object
-
Дар асоси хэш, мо индекси сабадро ҳисоб мекунем.
Чӣ тавр мо метавонем онро ҳисоб кунем?
*Мутаассифона, ман дар ин чо чавоби аник надодам. Шумо рақами дароз доред - ҳаш, ва 16 сатил вуҷуд дорад - индексро чӣ гуна бояд муайян кард, то an objectҳои дорои хэшҳои гуногун дар байни сатилҳо баробар тақсим карда шаванд? Ман тасаввур карда метавонам, ки индекс чунин ҳисоб карда мешавад:
int index = hash % buckets.length
Аллакай дар хона ман дидам, ки татбиқи аслӣ дар codeи сарчашма каме фарқ мекунад:
static int indexFor(int h, int length) { return h & (length - 1); }
-
Мо тафтиш мекунем, ки ягон бархӯрд вуҷуд надорад ва a1-ро ворид кунед.
-
Биёед ба усул мегузарем
get
. Мисолҳои a1 ва a2 кафолат дода мешаванд, ки дороиhash
суроғаҳои гуногун (дар хотира) мебошанд, бинобар ин мо барои ин калид чизе намеёбемЧӣ мешавад, агар мо онро танҳо
hashcode
дар синфи А аз нав муайян кунем ва кӯшиш кунем, ки ба хэшмап аввал ҷуфт бо калиди a1 ва баъд бо a2 ворид кунем?Пас, аввал мо сабади дилхоҳро аз ҷониби пайдо мекунем
hashcode
- ин амалиёт дуруст иҷро карда мешавад. Минбаъд, биёед аз an objectҳоиEntry
дар LinkedList ба ароба замимашуда гузаред ва калидҳоро аз рӯиequals
. Зероequals
аст, бекор карда намешавад, он гоҳ татбиқи базавӣ аз синф гирифта мешавадObject
- муқоиса бо истинод. a1 ва a2 кафолат дода мешавад, ки истинодҳои гуногун дошта бошанд, аз ин рӯ, мо унсури воридшуда a1 -ро "пазмон" хоҳем кард ва a2 дар LinkedList ҳамчун гиреҳи нав ҷойгир карда мешавад.Хулоса чист? Оё мумкин аст, ки ҳамчун калид дар
HashMap
an 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 як масъалаи оддӣ, вале тасвирӣ, ки ман дар як ширкати дигар мусоҳиба дода шудаам. Ин ҳама барои ман аст, ман умедворам, ки ин мақола ба касе кӯмак мекунад, ки дониши худро амиқтар кунад ё ташкил кунад. Омузиши ҳама муборак!
GO TO FULL VERSION