Sa nakaraang dalawang artikulo, tinalakay namin ang ilang mahahalagang tanong na madalas itanong sa iyo sa mga panayam. Oras na para magpatuloy at tingnan ang iba pang mga tanong.
Malalim na pagkopya at mababaw na pagkopya
Ang eksaktong kopya ng orihinal ay ang clone nito. Sa Java, nangangahulugan ito ng kakayahang lumikha ng isang bagay na may katulad na istraktura sa orihinal na bagay. Ang pamamaraanclone()
ay nagbibigay ng pag-andar na ito. Ang mababaw na pagkopya ng mga kopya ng kaunting impormasyon hangga't maaari. Bilang default, ang pag-clone sa Java ay mababaw, i.e. Object class
hindi alam ang tungkol sa istruktura ng klase na kinokopya nito. Kapag nag-clone, ginagawa ng JVM ang sumusunod:
- Kung ang isang klase ay mayroon lamang mga miyembro ng primitive na uri, pagkatapos ay isang ganap na bagong kopya ng object ay gagawin at isang reference sa object na iyon ay ibabalik.
- Kung ang isang klase ay naglalaman ng hindi lamang mga miyembro ng primitive na uri, kundi pati na rin ang anumang iba pang uri ng klase, kung gayon ang mga sanggunian sa mga bagay ng mga klase na ito ay kinokopya. Samakatuwid, ang parehong mga bagay ay magkakaroon ng parehong mga sanggunian.
- Hindi na kailangang kopyahin nang hiwalay ang primitive na data;
- Dapat suportahan ng lahat ng klase ng miyembro sa orihinal na klase ang pag-clone. Para sa bawat miyembro ng klase, dapat tawagan
super.clone()
kapag na-override ang pamamaraanclone()
; - Kung ang sinumang miyembro ng isang klase ay hindi sumusuporta sa pag-clone, pagkatapos ay sa clone na paraan, kailangan mong lumikha ng isang bagong instance ng klase na iyon at kopyahin ang bawat miyembro nito na may lahat ng mga katangian sa isang bagong object ng klase, nang paisa-isa.
Ano ang synchronization? Pag-lock sa antas ng bagay at pag-lock sa antas ng klase?
Ang pag-synchronize ay tumutukoy sa multithreading. Ang isang naka-synchronize na bloke ng code ay maaari lamang isagawa ng isang thread sa isang pagkakataon. Binibigyang-daan ka ng Java na magproseso ng maramihang mga thread nang sabay-sabay. Ito ay maaaring magresulta sa dalawa o higit pang mga thread na gustong ma-access ang parehong field. Nakakatulong ang pag-synchronize na maiwasan ang mga error sa memorya na nangyayari kapag ginamit nang hindi tama ang mga mapagkukunan ng memorya. Kapag ang isang paraan ay idineklara bilang naka-synchronize, hawak ng thread ang monitor nito. Kung ang isa pang thread ay sumusubok na mag-access ng isang naka-synchronize na paraan sa oras na ito, ang thread ay naharang at naghihintay para sa monitor na maging libre. Ang synchronization sa Java ay nagagawa gamit ang espesyal na naka-synchronize na keyword . Maaari mong markahan ang mga indibidwal na bloke o pamamaraan sa iyong klase sa ganitong paraan. Ang naka-synchronize na keyword ay hindi maaaring gamitin kasabay ng mga variable o attribute ng klase. Ang Object-level na locking ay isang mekanismo kapag gusto mong i-synchronize ang isang non-static na paraan o non-static na block ng code para isang thread lang ang makakapag-execute ng block ng code sa isang partikular na instance ng klase. Dapat itong palaging gawin upang gawing ligtas ang thread ng halimbawa ng klase. Pinipigilan ng pag-lock ng antas ng klase ang maraming thread na pumasok sa isang naka-synchronize na bloke para sa lahat ng available na pagkakataon ng klase. Halimbawa, kung mayroong 100 instance ng DemoClass class, 1 thread lang ang makakapag-execute ng demoMethod() gamit ang isa sa mga variable sa isang partikular na oras. Dapat itong palaging gawin upang matiyak ang kaligtasan ng static na thread. Matuto nang higit pa tungkol sa pag-synchronize dito.Ano ang pagkakaiba ng sleep() at wait()?
Sleep()
ay isang paraan na ginagamit upang maantala ang proseso ng ilang segundo. Sa kaso ng wait()
, ang thread ay nasa isang naghihintay na estado hanggang sa tawagin natin ang notify()
or method notifyAll()
. Ang pangunahing pagkakaiba ay ang wait()
paglabas nito ng lock ng monitor habang sleep()
hindi nito nilalabas ang lock. Wait()
ginagamit para sa mga multi-threaded na application, sleep()
ginagamit lang para i-pause ang thread execution. Thread.sleep()
inilalagay ang kasalukuyang thread sa "Not Runnable" na estado para sa isang tiyak na tagal ng panahon. Ang thread ay nagse-save ng estado ng monitor na bago tinawag ang pamamaraang ito. Kung ang isa pang thread ay tumawag t.interrupt()
, ang thread na "nakatulog" ay magigising. Tandaan na ito sleep()
ay isang static na pamamaraan, ibig sabihin ay palaging nakakaapekto ito sa kasalukuyang thread (ang nagpapatupad ng pamamaraan sleep()
). Ang isang karaniwang pagkakamali ay ang tumawag t.sleep()
kung saan t
ang isa pang thread; kahit na ang kasalukuyang thread na tumawag sa pamamaraan sleep()
ay hindi t
isang thread. Object.wait()
ipinapadala ang kasalukuyang thread sa "Not Runnable" na estado nang ilang sandali, tulad ng sleep()
, ngunit may kaunting nuance. Wait()
tinatawag sa isang bagay, hindi isang thread; tinatawag namin itong object na "lock object". Bago tumawag lock.wait()
, ang kasalukuyang thread ay dapat na naka-synchronize sa "lock object"; wait()
pagkatapos nito, inilalabas nito ang lock na ito, at idinaragdag ang thread sa "listahan ng paghihintay" na nauugnay sa lock na ito. Sa ibang pagkakataon, ang isa pang thread ay maaaring mag-synchronize sa parehong lock object at tumawag sa lock.notify()
. Ang pamamaraang ito ay "gigisingin" ang orihinal na thread, na naghihintay pa rin. Sa prinsipyo, wait()
/ notify()
ay maihahambing sa sleep()
/ interrupt()
, tanging ang aktibong thread ay hindi nangangailangan ng direktang pointer sa natutulog na thread, kailangan lamang nitong malaman ang shared lock object. Basahin ang detalyadong pagkakaiba dito.
Posible bang magtalaga ng null dito sa isang reference variable?
Hindi hindi mo kaya. Sa Java, ang kaliwang bahagi ng operator ng pagtatalaga ay dapat na isang variable. Ang "Ito" ay isang espesyal na keyword na palaging nagbibigay ng kasalukuyang instance ng klase. Ito ay hindi lamang anumang variable. Gayundin, ang null ay hindi maaaring italaga sa isang variable gamit ang "super" na keyword o anumang iba pang katulad na keyword.Ano ang pagkakaiba ng && at &?
&
- bitwise at &&
- lohikal.
&
sinusuri ang magkabilang panig ng operasyon;&&
sinusuri ang kaliwang bahagi ng operasyon. Kung totoo, patuloy itong sinusuri ang kanang bahagi.
Paano i-override ang equals() at hachCode() na mga pamamaraan?
hashCode()
at equals()
ang mga pamamaraan ay tinukoy sa class Object
, na siyang parent class para sa Java objects. Para sa kadahilanang ito, ang lahat ng Java object ay nagmamana ng default na pagpapatupad para sa mga pamamaraan. Ang pamamaraan hashCode()
ay ginagamit upang makakuha ng isang natatanging integer para sa isang naibigay na bagay. Ang integer na ito ay ginagamit upang matukoy ang lokasyon ng isang bagay kapag ang bagay na iyon ay kailangang maimbak, halimbawa sa HashTable
. Bilang default, hashCode()
nagbabalik integer
ng representasyon ng address ng lokasyon ng memorya kung saan nakaimbak ang bagay. Ang pamamaraan equls()
, gaya ng ipinahihiwatig ng pangalan nito, ay ginagamit upang subukan lamang kung magkapantay ang dalawang bagay. Sinusuri ng default na pagpapatupad ang mga object reference upang makita kung pantay ang mga ito. Nasa ibaba ang mahahalagang alituntunin para sa muling pagkarga ng mga pamamaraang ito:
- Palaging gamitin ang parehong mga katangian ng bagay kapag bumubuo
hashCode()
atequals()
; - Simetrya. Yung.
x
kung nagbabalik ito ng true para sa ilang objectsy
x.equals(y)
, dapat itongy.equals(x)
bumalik ng true; - Reflexivity. Para sa anumang bagay
x
x.equals(x)
ay dapat bumalik totoo; - Hindi pagbabago. Para sa anumang bagay
x
aty
x.equals(y)
ibinabalik ang parehong bagay kung ang impormasyong ginamit sa paghahambing ay hindi nagbabago; - Transitivity. Para sa anumang mga bagay
x
,y
atz
, kungx.equals(y)
ito ay nagbabalik ng true aty.equals(z)
nagbabalik ng totoo, dapat itongx.equals(z)
bumalik ng totoo; - Sa tuwing ang isang pamamaraan ay tinatawag sa parehong bagay sa panahon ng pagpapatupad ng aplikasyon, dapat itong ibalik ang parehong numero maliban kung ang impormasyong ginamit ay nagbabago.
hashCode
maaaring magbalik ng iba't ibang mga halaga para sa magkatulad na mga bagay sa iba't ibang mga pagkakataon ng aplikasyon; - Kung ang dalawang bagay ay pantay, ayon sa
equals
, dapat nilanghashCode
ibalik ang parehong mga halaga; - Ang kabaligtaran na kinakailangan ay opsyonal. Maaaring ibalik ng dalawang hindi pantay na bagay ang parehong hashCode. Gayunpaman, upang mapabuti ang pagganap, mas mahusay na magkaroon ng iba't ibang mga bagay na nagbabalik ng iba't ibang mga code.
Sabihin sa amin ang tungkol sa mga modifier ng access
Ang mga class, field, constructor, at method ng Java ay maaaring magkaroon ng isa sa apat na magkakaibang access modifier: pribado Kung ang isang paraan o variable ay minarkahan ng private , kung gayon ang code lamang sa loob ng parehong klase ang makaka-access sa variable, o tumawag sa pamamaraan. Hindi ma-access ng code sa loob ng mga subclass ang isang variable o pamamaraan, at hindi rin ito ma-access mula sa anumang ibang klase. Ang modifier ng pribadong access ay kadalasang ginagamit para sa mga constructor, pamamaraan, at variable. default Ang default na access modifier ay idineklara kung ang modifier ay hindi tinukoy sa lahat. Ang modifier na ito ay nangangahulugan na ang pag-access sa mga field, constructor at pamamaraan ng isang partikular na klase ay maaaring makuha sa pamamagitan ng code sa loob ng klase mismo, code sa loob ng mga klase sa parehong pakete. Hindi maa-access ng mga subclass ang mga pamamaraan at mga variable ng miyembro ng isang superclass kung idineklara ang mga ito bilang default , maliban kung ang subclass ay nasa parehong pakete ng superclass. protected Ang protektadong modifier ay gumagana katulad ng default , maliban na ang mga subclass ay maaari ding ma-access ang mga protektadong pamamaraan at variable ng superclass. Ang pahayag na ito ay totoo kahit na ang subclass ay wala sa parehong pakete ng superclass. public Ang modifier ng pampublikong access ay nangangahulugan na ang lahat ng code ay maaaring ma-access ang klase, ang mga variable, constructor, o pamamaraan nito, saanman matatagpuan ang code na iyon.Ano ang isang basurero? Tawagan natin siya?
Ang koleksyon ng basura ay isang tampok ng awtomatikong pamamahala ng memorya sa maraming modernong programming language, tulad ng Java at mga wika sa NET.Framework. Ang mga wikang gumagamit ng pangongolekta ng basura ay kadalasang binibigyang kahulugan ang pangongolekta ng basura sa isang virtual machine gaya ng JVM. Ang pangongolekta ng basura ay may dalawang layunin: ang anumang hindi nagamit na memorya ay dapat palayain, at ang memorya ay hindi dapat palayain kung ginagamit pa rin ito ng programa. Maaari mo bang manual na patakbuhin ang pangongolekta ng basura? Hindi,System.gc()
binibigyan ka nito ng mas maraming access hangga't maaari. Ang pinakamagandang opsyon ay tawagan ang paraan System.gc()
, na magpahiwatig sa kolektor ng basura na kailangan nitong tumakbo. Walang paraan upang patakbuhin ito kaagad dahil ang tagakolekta ng basura ay hindi deterministiko. Bilang karagdagan, ayon sa dokumentasyon, OutOfMemoryError
hindi ito maipapasa kung nabigo ang virtual machine na magbakante ng memorya pagkatapos ng buong koleksyon ng basura. Matuto pa tungkol sa basurero dito.
Ano ang ibig sabihin ng katutubong keyword? Ipaliwanag nang detalyado
Ang katutubong keyword ay ginagamit upang ipahiwatig na ang pamamaraan ay ipinatupad sa isang programming language maliban sa isang Java file. Ang mga katutubong pamamaraan ay ginamit sa nakaraan. Sa kasalukuyang mga bersyon ng Java ito ay kinakailangan nang mas madalas. Sa kasalukuyan, kailangan ang mga katutubong pamamaraan kapag:- Dapat kang tumawag sa isang library mula sa Java na nakasulat sa ibang wika.
- Kailangan mo ng access sa mga mapagkukunan ng system o hardware na maaari lamang ma-access gamit ang ibang wika (karaniwan ay C). Sa katunayan, maraming mga function ng system na nakikipag-ugnayan sa totoong computer (tulad ng mga disk o data ng network) ay matatawag lamang sa pamamagitan ng katutubong pamamaraan.
- Maaaring ma-destabilize ng JNI/JNA ang JVM, lalo na kung susubukan mong gumawa ng isang bagay na kumplikado. Kung may mali sa iyong katutubong pamamaraan, may posibilidad na mag-crash ang JVM. Gayundin, maaaring mangyari ang masasamang bagay kung ang iyong katutubong pamamaraan ay tinawag mula sa maraming mga thread. At iba pa.
- Mas mahirap i-debug ang isang program na may native code.
- Ang native code ay nangangailangan ng hiwalay na pagbuo ng mga frameworks, na maaaring lumikha ng mga problema sa pag-port sa ibang mga platform.
Ano ang serialization?
Sa computer science, sa konteksto ng pag-iimbak at paghahatid ng data, ang serialization ay ang proseso ng pagsasalin ng istruktura ng data o ang estado ng isang bagay sa isang format na maaaring iimbak at makuha sa ibang pagkakataon sa ibang computing environment. Pagkatapos makatanggap ng isang serye ng mga bit, sila ay muling kinakalkula ayon sa serialization format, at maaaring magamit upang lumikha ng isang semantically identical clone ng orihinal na bagay. Nagbibigay ang Java ng awtomatikong serialization, na nangangailangan ng object na ipatupad ang interfacejava.io.Serializable
. Ang pagpapatupad ng interface ay minarkahan ang klase bilang "maseries". Ang java.io.Serializable na interface ay walang mga pamamaraan ng serialization, ngunit ang serializable na klase ay maaaring opsyonal na tukuyin ang mga pamamaraan na tatawagin bilang bahagi ng proseso ng serialization/diserialization. Kapag gumagawa ng mga pagbabago sa mga klase, kailangan mong isaalang-alang kung alin ang magiging at hindi tugma sa serialization. Maaari mong basahin ang buong tagubilin dito. Ibibigay ko ang pinakamahalagang punto: Mga hindi tugmang pagbabago:
- Magtanggal ng field;
- Ilipat ang isang klase pataas o pababa sa hierarchy;
- Pagbabago ng non-static na field sa static o non-transient sa transient;
- Pagbabago ng ipinahayag na primitive na uri ng data;
- Pagbabago ng paraan
WriteObject
upangReadObject
hindi na sila magsulat o magbasa ng mga field bilang default; - Pagpapalit ng klase
Serializable
saExternalizable
o vice versa; - Pagbabago ng isang enum class sa isang non-enum o vice versa;
- Tinatanggal
Serializable
oExternalizable
; - Pagdaragdag
writeReplace
ng isangreadResolve
paraan sa isang klase.
- Pagdaragdag ng mga patlang;
- Pagdaragdag/pag-alis ng mga klase;
- Pagdaragdag ng mga pamamaraan
WriteObject/ReadObject
[mga pamamaraandefaultReadObject
odefaultWriteObject
dapat tawagan sa simula]; - Pag-alis ng mga pamamaraan
WriteObject/ReadObject
; - Dagdag
java.io.Serializable
; - Pagbabago ng access sa field;
- Pagbabago ng static na field sa non-static o transient sa non-transient .
GO TO FULL VERSION