JavaRush /Blog Jawa /Random-JV /Crita saka siji wawancara: pitakonan menarik
GuitarFactor
tingkat
Санкт-Петербург

Crita saka siji wawancara: pitakonan menarik

Diterbitake ing grup
Bubar aku duwe kesempatan kanggo nekani wawancara kanggo posisi intern ing salah sawijining perusahaan IT gedhe. Crita saka siji wawancara: pitakonan menarik - 1Iki minangka wawancara IT pisanan lan, miturut pendapatku, ternyata menarik. Secara total, aku "diinterogasi" luwih saka 3 jam (iki didhisiki peer lan tes ing kantor ing komputer). Aku pengin mbayar pajeg kanggo interviewer, sing ora nyerah nalika aku mangsuli pitakonan salah, nanging karo bantuan saka pitakonan anjog kang dipeksa aku kanggo mikir lan teka ing jawaban sing bener. Ing ngisor iki aku bakal menehi sawetara "sketsa" - miturut pendapatku, pitakonan sing cukup menarik, sawetara sing menehi pemahaman sing luwih jero babagan aspek tartamtu ing Jawa. Mbok menawa iki bakal katon jelas kanggo sawetara, nanging aku mikir bakal ana sing bakal migunani. Ing ngisor frasa kasebut disorot ing font ing ngisor iki: Pewawancara - kanthi kandel Panjelasan Voice-over lan pikiranku - kanthi miring Jawabanku - kanthi font biasa Kita wis rampung karo latar mburi, ayo miwiti bisnis)

Sketsa 1. "Cara sing katon prasaja"

Tulisen kepriye caramu ngleksanakake cara kang ngasilake asil pembagian angka a karo angka b. Pewawancara nulis ing kertas
int 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
Ing kasus iki, dividecara 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 intkanggo 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 tengah ArrayListutawa ing tengah LinkedList? *Ing kene aku mlumpat, aku eling yen ing endi wae aku maca kaya "nggunakake LinkedListkanggo 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
  1. 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.
  2. Kanggo LinkedList.. Kita pisanan tekan tengah ing wektu linear lan banjur masang unsur ing wektu pancet, ngganti pranala kanggo unsur tetanggan.
Dadi ternyata, sing luwih cepet? Hm... Pranyata padha. Nanging kapan LinkedListluwih cepet? Pranyata metu sing nalika kita masang menyang separo pisanan saka dhaftar. Contone, yen sampeyan nglebokake ing wiwitan, sampeyan ArrayListkudu ngetung maneh kabeh indeks nganti buntut, nanging sampeyan LinkedListmung 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 ing Object, 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 equalslan 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!*
  1. Nggawe rong conto kelas A

  2. Kita nggawe peta kosong, sing minangka standar duwe 16 kranjang. Tombol iku obyek saka kelas A, kang equalslan cara ora ditimpa hashcode.

  3. Sijine a1ing peta. Kanggo nindakake iki, pisanan kita ngetung hash a1.

    Apa hash bakal padha?

    Alamat sel ing memori minangka implementasi metode saka kelasObject

  4. 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);
    }
  5. Kita mriksa yen ora ana tabrakan lan masang a1.

  6. Ayo pindhah menyang cara get. Instance a1 lan a2 dijamin duwe beda hash(alamat beda ing memori), mula kita ora bakal nemokake apa-apa kanggo kunci iki

    Apa yen kita nemtokake maneh mung hashcodeing 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 obyek Entrying LinkedList ditempelake ing cart lan mbandhingaké tombol dening equals. Amarga equalsora diganti, banjur implementasine dhasar dijupuk saka kelas Object- 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 HashMapobyek kanthi non-overridden equalshashcode?

    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 Stackmemori HeapJawa (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 Stackmemori kanggo telpon metode sabanjure, lan OutOfMemorypapan kanggo obyek wis entek ing Heapmemori *
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!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION