CodeGym /Blog Jawa /Acak /Njelajah pitakonan lan jawaban saka wawancara proyek kang...
John Squirrels
tingkat
San Francisco

Njelajah pitakonan lan jawaban saka wawancara proyek kanggo posisi pangembang Jawa. Bagean 10

Diterbitake ing grup
Hi! Pira jam sing dibutuhake kanggo dadi master ing sesuatu? Aku wis kerep krungu kaya: "Kanggo dadi master ing apa wae, sampeyan kudu nglampahi 10.000 jam ing." Iku nomer sing medeni, ta? Njelajah pitakonan lan jawaban saka wawancara proyek kanggo posisi pangembang Jawa.  Bagean 10 - 1Isih, aku kepingin weruh yen iku bener. Lan aku terus-terusan nyoba ngerteni pirang-pirang jam aku wis nandur modal kanggo nguwasani seni pemrograman. Lan nalika aku ngliwati garis khusus 10.000 jam lan dadi master, apa aku bakal ngrasakake bedane? Utawa apa aku wis suwe ngliwati garis kasebut tanpa disadari? Apa wae, sampeyan ora kudu nandur modal wektu sing akeh banget kanggo dadi programmer. Sing penting nggunakake wektu kanthi wicaksana. Tujuan utama sampeyan yaiku entuk wawancara. Lan ing wawancara, bakal dadi pangembang piranti lunak pisanan ditakoni babagan teori, mula kudu dadi kekuatan. Nyatane, nalika nyiapake wawancara, tugas sampeyan nemokake kabeh kesenjangan ing kawruh teori dhasar Jawa banjur diisi. Dina iki aku ing kene kanggo nulungi sampeyan, amarga dina iki kita bakal nerusake review babagan pitakonan wawancara sing paling populer. Inggih, ayo nerusake!

89. Kepiye ArrayList beda karo LinkedList?

Iki minangka salah sawijining pitakonan sing paling populer, bebarengan karo pitakonan babagan struktur internal HashMap . Ora ana wawancara sing lengkap tanpa wawancara, mula jawaban sampeyan kudu gampang digulung. Saliyane ketok (padha duwe jeneng beda), padha beda-beda ing struktur internal. Sadurungé, kita ngrembug struktur internal ArrayList lan LinkedList , mula aku ora bakal nyilem rincian implementasine. Aku mung bakal ngelingake sampeyan yen ArrayList diimplementasikake nggunakake array internal sing ukurane mundhak kanthi dinamis miturut rumus iki:
<size of the current array> * 3 / 2 + 1
Kajaba iku, implementasi LinkedList nggunakake dhaptar internal dobel link, yaiku, saben unsur nduweni referensi menyang unsur sadurunge lan sabanjure, kajaba unsur ing wiwitan lan pungkasan dhaptar. Interviewers seneng takon pitakonan iki kaya iki, "Sing luwih apik, ArrayList utawa LinkedList ?" ngarep-arep bisa nyekel sampeyan. Sawise kabeh, yen sampeyan ngomong siji utawa liyane luwih apik, sampeyan wis menehi jawaban sing salah. Njelajah pitakonan lan jawaban saka wawancara proyek kanggo posisi pangembang Jawa.  Bagean 10 - 2Nanging, sampeyan kudu njlentrehake kahanan tartamtu sing sampeyan gunakake: ngakses unsur kanthi indeks utawa nyisipake ing tengah dhaptar. Banjur, gumantung saka jawabane, sampeyan bisa nerangake endi sing luwih apik. Aku sadurunge nerangake carane ArrayList lan LinkedList bisa digunakake ing saben kahanan. Ayo ngringkes iki kanthi nglebokake baris kanggo mbandhingake: Nambah unsur (nambah)
  1. Yen indeks ora ditemtokake, item anyar bakal ditambahake kanthi otomatis ing pungkasan kanggo rong jinis dhaptar kasebut. Ing LinkedList , unsur anyar bakal dadi buntut anyar (mung pasangan referensi sing bakal ditulis maneh, dadi kerumitan algoritma yaiku O(1) ).

    Cara nambah nambahake unsur menyang sel kosong pungkasan ing larik ( O(1) ).

  2. Nambahake item kanthi indeks biasane tegese nglebokake ing endi wae ing tengah dhaptar. Ing LinkedList , cara kasebut bakal nggoleki lokasi sing dikarepake kanthi ngubengi unsur-unsur saka buntut lan sirah ( O(n/2) ) lan banjur bakal nglebokake nilai kasebut kanthi nimpa referensi unsur-unsur ing sisih loro-lorone. unsur anyar dilebokake ( O(1) ). Kompleksitas algoritma sakabèhé saka operasi iki bakal dadi O(n/2) .

    Ing kahanan sing padha (nambah kanthi indeks), ArrayList nemokake lokasi sing dikarepake ( O(1) ) lan banjur nggeser kabeh unsur sing ana ing sisih tengen (kalebu unsur sing wis disimpen ing indeks sing ditemtokake) menyang sisih tengen siji (kang bisa uga mbutuhake nggawe array internal anyar lan nyalin unsur kasebut) ( O(n/2) ). Kompleksitas sakabèhé yaiku O(n/2) .

  3. Nambahake unsur ing wiwitan LinkedList padha karo nambah unsur ing pungkasan: unsur anyar dadi kepala anyar ( O (1) ). Nanging kanggo ArrayList, operasi kasebut mbutuhake mindhah kabeh unsur ing sisih tengen ( O(n) ).

Ing ngisor iki yaiku kanggo LinkedList kerumitan algoritma bakal mulai saka O(1) nganti O(n/2) . Pengamatan liyane yaiku yen luwih cedhak sisipan kasebut ing pungkasan utawa wiwitan dhaptar, luwih cepet. Kanggo ArrayList , kerumitan algoritmik saka O(1) nganti O(n) , lan sing luwih cedhak karo sisipan menyang mburi dhaptar, luwih cepet. Nyetel unsur (set) Operasi iki nulis unsur menyang posisi sing ditemtokake ing dhaptar, nimpa unsur sing ana. Ing LinkedList , operasi iki padha karo nambah, amarga tantangan paling gedhe ing kene yaiku nemokake lokasi unsur kasebut. Unsur sing ana ditindhes kanthi nganyari pasangan referensi, supaya maneh duwe kerumitan algoritma sing beda-beda saka O (1) nganti O (n / 2) , gumantung saka jarak posisi sing dikarepake saka pungkasan utawa wiwitan dhaptar. Nanging kanggo ArrayList , operasi iki nemokake sel sing dikarepake miturut indeks lan nulis unsur anyar ing kana. Kaya operasi sing disetel, nggoleki kanthi indeks nduweni kerumitan algoritma O(1) . Entuk unsur kanthi indeks (entuk) Entuk unsur saka LinkedList ngetutake prinsip telusuran sing padha sing digunakake ing operasi liyane. Kompleksitas gumantung saka jarak saka pungkasan utawa wiwitan, yaiku beda-beda saka O(1) nganti O(n/2) . Kaya sing kacathet sadurunge, kanggo ArrayList , nemokake unsur kanthi indeks ing array internal nduweni kerumitan O(1) . Mbusak unsur kanthi indeks (mbusak) Kanggo LinkedList , prinsip sing padha ditrapake maneh. Kaping pisanan, unsur kasebut dumunung, banjur referensi ditulis maneh, tanggane unsur sing wis dibusak saiki saling ngrujuk, ngilangi referensi menyang unsur sing wis dibusak, sing sabanjure bakal dibersihake dening pengumpul sampah. Ing tembung liya, kerumitan algoritma isih padha - beda-beda saka O(1) nganti O(n/2) . Kanggo ArrayList , operasi iki luwih kaya nambah unsur anyar (nambah). Pisanan, cara nemokake unsur sing dikarepake ( O(1) ), mbusak, banjur kabeh unsur sing ana ing sisih tengen dipindhah siji langkah ngiwa kanggo nutup celah sing digawe dening penghapusan. Mbusak unsur nduweni kerumitan algoritma sing padha karo operasi tambah - saka O(1) nganti O(n). Sing luwih cedhak unsur sing dicopot menyang mburi dhaptar, luwih murah kerumitan algoritma operasi iki. Lan saiki kita wis nutupi kabeh operasi utama. Ayo kula ngelingake sampeyan yen mbandhingake rong jinis dhaptar iki, sampeyan kudu njlentrehake kahanan tartamtu sing digunakake. Mung banjur sampeyan bisa mangsuli pitakon sing diwawancara kanthi tegas.

90. Kepiye ArrayList beda karo HashSet?

Yen kita bisa mbandhingaké ArrayList lan LinkedList ing basis operasi-by-operasi kanggo nemtokake kang luwih apik, kita ora bakal nemokake iku supaya gampang kanggo nggawe comparison kuwi antarane ArrayList lan HashSet , amarga padha koleksi temen beda. Sampeyan bisa mbandhingake siji panganan cuci mulut karo liyane, nanging mbandhingake panganan cuci mulut lan sajian gurih iku tantangan - padha painfully beda. Nanging, aku bakal nyoba nuduhake sawetara bedane ing antarane:
  • ArrayList ngleksanakake antarmuka List nalika HashSet ngleksanakake antarmuka Set .

  • ArrayList ngidini sampeyan ngakses unsur kanthi indeks: operasi get duwe kerumitan algoritma O (1) , nanging HashSet mung ngidini sampeyan ngakses unsur sing dikarepake kanthi pengulangan, sing ngasilake kerumitan algoritma mulai saka O (1) nganti O (n) .

  • ArrayList ngidini unsur duplikat. Ing HashSet , kabeh unsur unik: sembarang upaya kanggo nambah unsur sing wis ana ing HashSet bakal gagal (duplikat dicenthang nganggo kode hash, mula jenenge koleksi iki).

  • ArrayList diimplementasikake nggunakake array internal, nanging HashSet diimplementasikake nggunakake HashMap internal .

  • ArrayList njaga urutan sisipan unsur, nanging HashSet minangka set sing ora diurutake lan ora njaga urutan unsur.

  • ArrayList ngidini sawetara nilai null, nanging sampeyan mung bisa nambah siji nilai null menyang HashSet ( sawise kabeh, unsur kudu unik).

91. Yagene Jawa duwe macem-macem implementasi array dinamis?

Iki luwih saka pitakonan filosofis. Kita uga bisa takon kenapa dheweke nggawe akeh teknologi anyar lan macem-macem? Kanggo penak. Lan bab sing padha bener babagan akeh implementasi array dinamis. Ora ana sing bisa diarani implementasine sing paling apik utawa becik. Saben duwe kaluwihan kahanan tartamtu. Tugas kita yaiku ngerti bedane lan kekuwatan / kelemahane supaya bisa nggunakake koleksi sing paling cocog kanggo kahanan apa wae.

92. Yagene Jawa duwe akeh implementasine panyimpenan nilai-kunci?

Ing kene kahanane padha karo implementasine array dinamis. Mesthine ora ana sing luwih apik tinimbang liyane: saben duwe kekuwatan lan kelemahane. Lan kita kudu ngoptimalake kekuwatane, mesthine. Conto: paket concurrent, sing akeh kelas multithreaded, duwe koleksi Concurrent dhewe . Kelas ConcurrentHashMap nduweni kaluwihan tinimbang HashMap standar ing babagan safety nalika nggarap data ing lingkungan multi-threaded, nanging ana biaya kinerja sing luwih alon. Lan implementasine sing dudu pilihan sing paling apik ing kahanan apa wae mboko sithik mandheg digunakake. Contone: Hashtable , sing asline dimaksudake dadi HashMap sing aman kanggo benang , wis dilalekake lan ora bisa digunakake, amarga ConcurrentHashMap luwih apik tinimbang Hashtable nalika nggarap lingkungan multi-threaded.

93. Kepiye cara ngurutake koleksi unsur?

Wangsulan: Bab ingkang pisanan ngomong iku kelas makili unsur koleksi kudu ngleksanakake antarmuka Comparable , kang kasusun saka cara compareTo . Utawa sampeyan butuh kelas sing ngleksanakake antarmuka Comparator , kalebu cara mbandhingake . Kaloro cara kasebut nuduhake carane mbandhingake obyek saka jinis tartamtu. Iki kritis nalika ngurutake, amarga algoritma ngurutake kudu ngerti prinsip apa sing digunakake kanggo mbandhingake unsur. Iki utamane ditindakake kanthi ngetrapake Comparable langsung ing kelas sing pengin diurutake. Nggunakake Comparator kurang umum. Upaminipun sampeyan nggunakake kelas saka sawetara perpustakaan lan ora ngleksanakake Comparable , nanging sampeyan kudu ngurutake koleksi obyek sawijining. Awit sampeyan ora bisa ngganti kode saka kelas iki (kajaba ndawakake), sampeyan bisa nulis implementasine saka Comparator sing nuduhake carane mbandhingaké obyek saka kelas. Lan conto liyane. Yen sampeyan kudu ngurutake obyek saka jinis sing padha kanthi cara sing beda, sampeyan bisa nulis macem-macem implementasi Comparator kanggo digunakake ing kahanan sing beda. Minangka aturan, akeh kelas out-of-the-box, contone, String , wis ngleksanakake antarmuka Comparable . Tegese sampeyan ora perlu kuwatir babagan cara mbandhingake kelas kasebut. Sampeyan mung bisa nerusake lan nggunakake. Cara pisanan lan paling jelas yaiku nggunakake kelas TreeSet utawa TreeMap . Kelas-kelas iki nyimpen unsur-unsur ing urutan sing diurutake adhedhasar komparator sing ditindakake dening unsur kelas. Aja lali yen TreeMap ngurutake kunci, dudu nilai. Yen sampeyan nggunakake Comparator tinimbang Comparable , sampeyan kudu ngirim obyek Comparator menyang konstruktor koleksi nalika nggawe:
TreeSet treeSet = new TreeSet(customComparator);
Nanging kepiye yen sampeyan duwe jinis koleksi sing beda? Carane sampeyan ngurutake? Ing kasus iki, cara kapindho kelas sarana Koleksi - cara sort () - cocok. Cara kasebut statis, dadi sampeyan mung kudu prepend jeneng kelas banjur mlebu ing dhaptar sing bakal diurutake. Tuladhane:
Collections.sort(someList);
Yen sampeyan nggunakake implementasine Comparator tinimbang Comparable , mula sampeyan kudu nglebokake minangka argumen kapindho:
Collections.sort(someList, customComparator);
Operasi iki bakal ngganti urutan internal saka unsur ing dhaftar liwati: dhaftar bakal diurutake nggunakake comparator. Elinga yen dhaptar sing dilewati kudu bisa diganti, yen cara kasebut bakal gagal lan mbuwang UnsupportedOperationException . Pilihan katelu nggunakake cara diurutake kelas Stream , sing ngurutake unsur koleksi. Yen kita nggunakake Comparable :
someList = someList.stream().sorted().collect(Collectors.toList());
Yen kita nggunakake Comparator :
someList = someList.stream().sorted(customComparator).collect(Collectors.toList());
Cara kaping papat yaiku kanthi manual ngleksanakake algoritma sort, contone, bubble sort utawa merge sort .

Kelas obyek. padha () lan hashCode ()

94. Wenehana katrangan ringkes babagan kelas Obyek ing basa Jawa.

Ing bagean kapindho review, kita wis ngrembug cara kelas Obyek . Ing kene aku bakal ngelingake yen kelas Obyek minangka leluhur saben kelas ing Jawa. Nduwe 11 metode, sing diwarisake dening kabeh kelas. Njelajah pitakonan lan jawaban saka wawancara proyek kanggo posisi pangembang Jawa.  Bagean 10 - 3

95. Apa padha () lan hashCode () digunakake ing Jawa?

hashCode () minangka metode kelas Obyek sing diwarisake dening kabeh kelas. Tugase yaiku ngasilake nomer sing nggambarake obyek tartamtu. Conto saka cara iki ing tumindak bisa ditemokaké ing HashMap , ngendi iku disebut ing obyek tombol kanggo njaluk hashcode lokal, kang bakal nemtokake kang ember (sel saka array internal) tombol-nilai pasangan bakal disimpen ing. cara iki umume digunakake ing witjaksono () cara minangka salah siji saka cara utama kanggo ngenali obyek. witjaksono () iku sawijining cara saka kelas Obyek sing proyek kanggo mbandhingaké obyek lan nemtokake apa padha. Cara iki digunakake nang endi wae kita kudu mbandhingaké obyek, amarga standar == operator comparison ora cocok kanggo obyek, awit iku mung mbandhingaké referensi obyek.

96. Marang kita bab kontrak antarane witjaksono () lan hashCode () ing Jawa?

Kaping pisanan, supaya cara sing padha () lan kode hashCode () bisa digunakake kanthi bener, kudu diganti kanthi bener. Implementasi anyar kudu ngetutake aturan kasebut:
  • Obyek sing padha karo bali sing bener kudu duwe kode hash sing padha.
  • Obyek kanthi kode hash sing padha ora mesthi padha.
Saiki katon kaya papan sing apik kanggo ngaso nganti bagean sabanjure review!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION