Sketsa 1. "Cara sing katon prasaja"
Tulisen kepriye caramu ngleksanakake cara kang ngasilake asil pembagian angka a karo angka b. Pewawancara nulis ing kertasint divide(int a, int b) {
}
* Aku nglirik ora percaya ing kertas kanthi tandha metode. Apa tangkapan?* Aku nulis:
int divide(int a, int b) {
return a/b;
}
Apa ana masalah karo metode iki? *Aku nyekel wong bodho sing bodho tenan * Ketoke ora .. Sabanjure teka pitakonan sing sah: Apa yen b = 0? *Wah, aku bakal diusir saka kantor iki yen terus kaya ngono!* Oh ya, mesthi. Ing kene kita duwe argumentasi jinis int, supaya Pengecualian Aritmetika bakal dibuwang. Yen bantahan ana jinis float utawa pindho, asile bakal Infinity. Apa sing bakal kita lakoni babagan iki? Aku wiwit nulis nyoba / nyekel
int divide(int a, int b) {
try {
return a/b;
} catch (Exception e) {
e.printStackTrace();
return ... // ??? what the hack?
}
}
* Aku njaluk bali lan beku: ana sing kudu dibalekake yen ana kesalahan. Nanging, piyé ”sesuatu” iki bisa dibédakaké karo asil pitungan? * Apa sing bakal kita bali? Hm ... Aku bakal ngganti jinis variabel bali menyang Integer lan ing cilik saka pangecualian aku bakal bali null. Coba bayangake yen kita ora bisa ngganti jinis kasebut. Apa kita bisa metu? Mungkin kita bisa nindakake liyane kajaba? *Iki teka* Kita uga bisa nerusake menyang cara nelpon! bener. Apa bakal katon kaya?
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();
}
}
Apa perlu kanggo nangani pangecualian? Ya, amarga kita terusake kanthi jelas saka metode pamisah. (*Aku salah ing kene! Apa ing ngisor iki minangka pitakonan utama saka pewawancara kanggo teka ing jawaban sing bener *) Lan Pengecualian Aritmetika - pengecualian apa wae - dicenthang utawa ora dicenthang? Iki minangka pangecualian Runtime, sing tegese ora dicenthang. * Punika rawuh pitakonan pembunuh * Dadi ternyata, ing tembung sampeyan, yen kita nemtokake mbuwang Aritmetika Pengecualian ing teken cara, banjur dadi pangecualian dicenthang? *Ugh!* Mbokmenawa... ora. Ya wis ora ana. Yen kita nunjukaké mbalang / istiméwa ora dicenthang / ing teken, kita mung ngelekake sing cara bisa uncalan pangecualian, nanging ora perlu kanggo nangani ing cara nelpon. Sing diurutake. Apa ana liyane sing bisa kita lakoni kanggo nyegah kesalahan? * Sawise sawetara pamikiran * Ya, kita uga bisa mriksa yen (b == 0). Lan nindakake sawetara logika. bener. Dadi, kita bisa nindakake 3 cara:
- nyoba / nyekel
- mbalang - nerusake kanggo cara nelpon
- mriksa argumen
divide
cara apa sing sampeyan pikir luwih apik? Aku bakal milih nerusake pangecualian menyang metode panggilan, amarga ... ing cara dibagi iku ora cetha carane proses istiméwa iki lan apa jinis asil int
kanggo bali ing cilik saka kesalahan. Lan ing cara nelpon, aku bakal nggunakake argumen b kanggo mriksa yen padha karo nol. Iku misale jek jawaban iki marem wong sing diwawancarai, nanging jujur, aku ora yakin yen jawaban iki ora jelas))
Sketsa 2. “Sapa sing luwih cepet?”
Sawise pitakonan standar, carane ArrayList beda karo LinkedList, teka iki: Apa sing bakal kelakon luwih cepet - nglebokake unsur menyang tengahArrayList
utawa ing tengah LinkedList
? *Ing kene aku mlumpat, aku eling yen ing endi wae aku maca kaya "nggunakake LinkedList
kanggo nyisipake utawa mbusak unsur ing tengah dhaptar." Ing omah, aku malah mriksa ceramah JavaRush kaping pindho, ana ukara: "Yen sampeyan arep nglebokake (utawa mbusak) akeh unsur ing tengah koleksi, luwih becik sampeyan nggunakake LinkedList
. Ing kabeh kasus liyane - ArrayList
." Dijawab kanthi otomatis * Bakal luwih cepet karo LinkedList
. Njlentrehake mangga
- Kanggo nglebokake unsur ing tengah
ArrayList
, kita nemokake unsur ing dhaptar ing wektu sing tetep, banjur ngitung maneh indeks saka unsur ing sisih tengen sing dilebokake, ing wektu linear. - Kanggo
LinkedList
.. Kita pisanan tekan tengah ing wektu linear lan banjur masang unsur ing wektu pancet, ngganti pranala kanggo unsur tetanggan.
LinkedList
luwih cepet? Pranyata metu sing nalika kita masang menyang separo pisanan saka dhaftar. Contone, yen sampeyan nglebokake ing wiwitan, sampeyan ArrayList
kudu ngetung maneh kabeh indeks nganti buntut, nanging sampeyan LinkedList
mung kudu ngganti referensi saka unsur pisanan. Moral: aja ngandel kanthi harfiah kabeh sing ditulis, sanajan ing JavaRush!)
Sketsa 3. "Endi kita tanpa padha lan kode hash!"
Obrolan babagan witjaksono lan hashcode dawa banget - carane ngatasi, apa implementasine ingObject
, apa sing kedadeyan ing hood, nalika unsur dilebokake menyang HashMap
, etc. Aku mung bakal nyebut sawetara TCTerms sing menarik ing mratelakake panemume * Mbayangno sing kita wis nggawe kelas
public class A {
int id;
public A(int id) {
this.id = id;
}
}
Lan padha ora override equals
lan hashcode
. Njlèntrèhaké apa sing bakal kelakon nalika kode dieksekusi
A a1 = new A(1);
A a2 = new A(1);
Map<A, String> hash = new HashMap<>();
hash.put(a1, "1");
hash.get(a2);
* Iku apik sing sadurunge Interview aku khusus ngginakaken sawetara dina kanggo mangerteni algoritma dhasar, kerumitan lan struktur data - iku mbantu kathah, thanks CS50!*
-
Nggawe rong conto kelas A
-
Kita nggawe peta kosong, sing minangka standar duwe 16 kranjang. Tombol iku obyek saka kelas A, kang
equals
lan cara ora ditimpahashcode
. -
Sijine
a1
ing peta. Kanggo nindakake iki, pisanan kita ngetung hasha1
.Apa hash bakal padha?
Alamat sel ing memori minangka implementasi metode saka kelas
Object
-
Adhedhasar hash, kita ngetung indeks basket.
Kepiye carane bisa ngetung?
* Sayange, aku ora menehi jawaban sing jelas ing kene. Sampeyan duwe nomer sing dawa - hash, lan ana 16 ember - kepiye carane nemtokake indeks supaya obyek kanthi hash beda-beda disebarake ing ember? Aku bisa mbayangno yen indeks diitung kaya iki:
int index = hash % buckets.length
Wis ing omah, aku weruh yen implementasi asli ing kode sumber rada beda:
static int indexFor(int h, int length) { return h & (length - 1); }
-
Kita mriksa yen ora ana tabrakan lan masang a1.
-
Ayo pindhah menyang cara
get
. Instance a1 lan a2 dijamin duwe bedahash
(alamat beda ing memori), mula kita ora bakal nemokake apa-apa kanggo kunci ikiApa yen kita nemtokake maneh mung
hashcode
ing kelas A lan nyoba nglebokake hashmap dhisik pasangan karo tombol a1, banjur nganggo a2?Banjur kita bakal nemokake basket sing dikarepake kanthi
hashcode
- operasi iki bakal ditindakake kanthi bener. Sabanjure, ayo miwiti liwat obyekEntry
ing LinkedList ditempelake ing cart lan mbandhingaké tombol deningequals
. Amargaequals
ora diganti, banjur implementasine dhasar dijupuk saka kelasObject
- comparison dening referensi. a1 lan a2 dijamin duwe pranala beda, supaya kita bakal "miss" unsur dipasang a1, lan a2 bakal diselehake ing LinkedList minangka simpul anyar.Apa kesimpulane? Apa bisa digunakake minangka kunci ing
HashMap
obyek kanthi non-overriddenequalshashcode
?Ora sampeyan ora bisa.
Sketsa 4. “Ayo ndang bubar!”
Sawise pitakonan babagan Kesalahan lan Pangecualian, pitakon ing ngisor iki: Tulis conto prasaja ing ngendi fungsi bakal mbuwang StackOverflow. * Banjur aku ngelingi carane kesalahan iki plagued kula nalika aku nyoba kanggo nulis sawetara fungsi rekursif * Iki mbokmenawa bakal kelakon ing cilik saka telpon rekursif, yen kondisi kanggo metu saka recursion salah kasebut. *Banjur aku nyoba sing pinter, akhire pewawancara mbantu, kabeh dadi prasaja*void sof() {
sof();
}
Kepiye kesalahan iki beda karo OutOfMemory
? * Aku ora mangsuli kene, mung mengko aku temen maujud sing iki pitakonan bab kawruh Stack
memori Heap
Jawa (telpon lan referensi kanggo obyek disimpen ing Stack, lan obyek dhewe disimpen ing memori Heap). Patut, StackOverflow dibuwang metu nalika ora ana papan maneh ing Stack
memori kanggo telpon metode sabanjure, lan OutOfMemory
papan kanggo obyek wis entek ing Heap
memori *
Iki minangka momen saka wawancara sing aku kelingan. Pungkasane, aku ditampa kanggo magang, dadi aku duwe latihan 2,5 wulan sadurunge aku lan, yen kabeh dadi apik, kerja ing perusahaan) Yen ana minat, aku bisa nulis artikel liyane, wektu iki luwih cilik, kanthi analisis masalah prasaja nanging ilustrasi sing aku diwenehi Interview ing perusahaan liyane. Mekaten kagem kula, mugi-mugi artikel menika saged mbiyantu tiyang ingkang langkung jero utawi nata kawruhipun. Sugeng sinau kabeh!
GO TO FULL VERSION