97. Apa kahanan redefinition persetujuan dileksanakake nalika redefining Equals?
Metode equals() sing ditindhes kudu tundhuk karo kahanan (aturan) ing ngisor iki:-
reflexivity - kanggo sembarang nilai x, ekspresi kaya x.equals(x) kudu tansah bali bener (nalika x != null ).
-
simetri - kanggo sembarang nilai x lan y, ekspresi saka wangun x.equals(y) kudu bali bener mung yen y.equals(x) bali bener .
-
transitivity - kanggo sembarang nilai x , y lan z , yen x.equals(y) bali bener lan y.equals(z) uga bali bener , banjur x.equals(z) kudu bali bener .
-
konsistensi - kanggo sembarang nilai x lan y, telpon bola-bali menyang x.equals(y) bakal tansah ngasilake nilai telpon sadurunge kanggo metode iki, kasedhiya yen kolom digunakake kanggo mbandhingaké rong obyek ora diganti antarane telpon. .
-
comparison null - kanggo sembarang Nilai x, nelpon x.equals(null) bakal bali palsu .
98. Apa sing kedadeyan yen sampeyan ora ngilangi Equals lan HashCode?
Ing kasus iki, hashCode () bakal ngasilake nomer sing digawe adhedhasar lokasi memori ing ngendi obyek kasebut disimpen. Yaiku, rong obyek kanthi kolom sing padha bakal nampa nilai sing beda nalika nelpon kode hash () sing ora ditimpa (sawise kabeh, disimpen ing lokasi memori sing beda). The unoverridden witjaksono () mbandhingaké referensi kanggo ndeleng apa padha nuding obyek padha utawa ora. Sing, comparison digawe liwat == , lan ing cilik saka obyek karo kolom padha bakal tansah bali palsu . Bener mung nalika mbandhingake referensi menyang obyek sing padha. Kadhangkala ana logika kanggo ora ngatasi metode kasebut. Contone, sampeyan pengin kabeh obyek saka kelas tartamtu dadi unik lan overriding cara iki mung bakal ngrusak logika uniqueness. Ingkang utama yaiku mangertos nuansa metode sing ditimpa lan ora ditindhes lan nggunakake pendekatan loro kasebut gumantung saka kahanan kasebut.99. Yagene simetri mung bener yen x.equals(y) bali bener?
Pitakonan sing rada aneh. Yen obyek A padha karo obyek B, banjur obyek B padha karo obyek A. Yen B ora padha karo obyek A, banjur carane ngelawan bisa? Iki logika prasaja.100. Apa tabrakan ing HashCode? Carane menehi hasil karo?
Tabrakan kode hash yaiku kahanan ing ngendi rong obyek sing beda nduweni nilai kode hash sing padha . Carane iki bisa? Kasunyatane yaiku kode hash dipetakan menyang jinis Integer , sing uga duwe sawetara saka -2147483648 nganti 2147483647, yaiku, kira-kira 4 milyar integer beda. Kisaran iki ageng, nanging ora tanpa wates. Mulane, kahanan bisa uga nalika rong obyek sing beda duwe kode hash sing padha. Iki banget ora mungkin, nanging bisa. Fungsi hash sing ora ditindakake uga bisa nambah frekuensi kode hash sing padha, sing bakal, contone, ngasilake nomer ing sawetara cilik, sing bakal nambah kemungkinan tabrakan. Kanggo nglawan tabrakan, sampeyan kudu duwe implementasine metode hashCode sing apik supaya panyebaran nilai maksimal lan kemungkinan mbaleni nilai minimal.101. Apa sing kedadeyan yen unsur sing melu kontrak HashCode ngganti regane?
Yen unsur sing melu ngetung kode hash wis diganti, banjur kode hash obyek kasebut dhewe bakal diganti (yen fungsi hash apik). Mulane, ing HashMap disaranake nggunakake obyek sing ora bisa diganti (ora bisa diganti) minangka kunci, amarga negara internal (kolom) ora bisa diganti sawise digawe. Mulane, kode hash uga ora diowahi sawise digawe. Yen sampeyan nggunakake obyek sing bisa diowahi minangka kunci, banjur nalika sampeyan ngganti kolom obyek iki, kode hash bakal diganti lan, minangka asil, sampeyan bisa ilang pasangan iki ing HashMap . Sawise kabeh, bakal disimpen ing ember kanggo kode hash asli, lan sawise ngganti, bakal digoleki ing ember liyane.102. Tulis metode Equals lan HashCode kanggo kelas Siswa, sing kalebu kolom jeneng String lan umur int
public class Student {
int age;
String name;
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || this.getClass() != o.getClass()) {
return false;
}
final Student student = (Student) o;
if (this.age != student.age) {
return false;
}
return this.name != null ? this.name.equals(student.name) : student.name == null;
}
@Override
public int hashCode() {
int result = this.age;
result = 31 * result + (this.name != null ? this.name.hashCode() : 0);
return result;
}
}
padha karo:
-
Kaping pisanan, kita mbandhingake pranala langsung, amarga yen pranala menyang obyek sing padha, apa gunane nerusake mriksa? Kabeh bakal bener .
-
Priksa null lan jinis kelas sing cocog, amarga yen obyek minangka argumentasi null utawa jinis liyane, iki tegese obyek kasebut ora padha - palsu .
-
Casting obyek argumentasi menyang siji jinis (yen ana obyek saka jinis induk).
-
Perbandingan lapangan kelas primitif (sawise kabeh, comparison liwat =! cukup kanggo iku ), yen lapangan ora padha - palsu .
-
Mriksa kolom non-primitif kanggo null lan padha (ing String cara ditimpa lan bakal mbandhingaké bener), yen loro kolom null utawa padha , banjur mriksa ends lan cara bali bener .
-
Nyetel nilai kode hash awal menyang primitif umur obyek .
-
Nikelake kode hash saiki kanthi 31 (kanggo panyebaran luwih akeh) lan nambahake kode hash saka kolom string non-primitif (yen ora null).
-
Ngasilake asil.
-
Minangka asil override kode hash iki, obyek kanthi jeneng lan nilai int sing padha bakal ngasilake nilai sing padha.
103. Apa bedane antarane nggunakake yen (obj instanceof Student) lan yen (getClass () == obj.getClass ())?
Ayo goleki apa sing ditindakake saben pendekatan:-
instanceof mriksa apa referensi obyek ing sisih kiwa minangka conto saka jinis ing sisih tengen utawa sawetara subtipe.
-
getClass() == ... mriksa identitas jinis.
104. Menehi gambaran singkat saka clone () cara.
Klone () minangka cara saka kelas Obyek , tujuane kanggo nggawe lan ngasilake klon saka obyek saiki (salinan saka obyek saiki). Kanggo nggunakake, sampeyan kudu ngleksanakake antarmuka panandha Cloneable :Student implements Cloneable
Lan ngganti metode clone() dhewe :
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
Sawise kabeh, ing kelas Obyek dilindhungi, yaiku, bakal katon mung ing kelas Siswa dhewe , nanging ora katon ing kelas saka njaba.
105. Apa peculiarity saka clone () cara digunakake karo kothak obyek saka jinis referensi?
Nalika kloning obyek, mung nilai primitif lan nilai referensi obyek sing disalin. Iki tegese yen obyek duwe pranala menyang obyek liyane ing lapangan internal, banjur mung link iki bakal kloning, nanging obyek liyane dhewe ora bakal kloning. Nyatane, iki sing diarani kloning permukaan. Nah, kepiye yen sampeyan butuh kloning lengkap kanthi kloning kabeh obyek sing bersarang? Kepiye mesthekake yen iki dudu salinan pranala, nanging klone lengkap obyek karo sel memori liyane sing dikuwasani ing tumpukan kasebut? Ing kasunyatan, kabeh iku cukup prasaja - kanggo iki sampeyan uga kudu ngalahake clone () cara ing saben kelas obyek internal iki lan nambah antarmuka panandha - Cloneable . Banjur ora bakal dadi referensi kanggo obyek sing bakal disalin, nanging obyek kasebut dhewe, amarga saiki uga duwe kemampuan kanggo nyalin awake dhewe.Pangecualian
106. Apa bedane kesalahan lan pengecualian?
Pangecualian lan kasalahan iku subclass saka kelas Throwable . Nanging, dheweke duwe bedane. Kesalahan kasebut nuduhake masalah sing kedadeyan utamane amarga sumber daya sistem sing ora cukup. Lan aplikasi kita ngirim ora ndeteksi jinis masalah iki. Sawetara conto kasalahan yaiku kacilakan sistem lan kesalahan memori. Kesalahan biasane kedadeyan nalika runtime amarga jinis sing ora dicenthang. Pangecualian minangka masalah sing bisa kedadeyan nalika runtime lan ing wektu kompilasi. Biasane iki kedadeyan ing kode sing ditulis dening pangembang. Tegese, pangecualian luwih bisa diprediksi lan luwih gumantung marang kita minangka pangembang. Ing wektu sing padha, kesalahan luwih acak lan luwih bebas saka kita, nanging gumantung marang masalah karo sistem kasebut dhewe ing ngendi aplikasi kita mlaku.107. Apa bedane dicenthang lan ora dicenthang, istiméwa, uncalan, uncalan.
Kaya sing dakkandhakake sadurunge, pangecualian minangka kesalahan sajrone eksekusi program lan sajrone kompilasi sing kedadeyan ing kode sing ditulis dening pangembang (amarga sawetara kahanan sing ora normal). Dipriksa minangka jinis pangecualian sing kudu ditindakake kanthi nggunakake mekanisme nyoba-nyekel utawa dibuwang menyang cara ing ndhuwur. Throws digunakake ing header metode kanggo nunjukake kemungkinan pengecualian sing ditindakake dening metode kasebut. Sing, iki mekanisme kanggo "mbuwang" pangecualian menyang cara ndhuwur. Ora dicenthang minangka jinis pangecualian sing ora perlu ditangani lan biasane kurang bisa diprediksi lan cenderung kedadeyan. Nanging, uga bisa diproses yen dikarepake. Throw digunakake nalika mbuwang pengecualian kanthi manual, contone:throw new Exception();
108. Apa hierarki pengecualian?
Hierarki pangecualian gedhe banget lan jembar, malah akeh banget kanggo nyritakake kabeh babagan kene. Mulane, kita bakal nimbang mung pranala tombol: Kene ing ndhuwur banget hirarki kita ndeleng kelas - Throwable - kelas umum, leluhur saka hirarki pangecualian, kang siji dipérang dadi:- Kesalahan - kesalahan kritis, ora bisa dicenthang.
- Pangecualian - dicenthang pangecualian.
109. Apa sing dicenthang lan ora dicenthang pengecualian?
Kaya sing dakkandhakake sadurunge:-
Dicenthang - pangecualian sing kudu sampeyan lakoni, yaiku, diproses kanthi nyoba - nyekel blok , utawa "terusake" menyang cara ing ndhuwur. Kanggo nindakake iki, ing tandha cara, sawise nyathet argumentasi metode, sampeyan kudu nggunakake trows <exception type> keyword , sing nuduhake pangguna cara yen metode kasebut bisa mbuwang pengecualian iki (kaya bebaya) lan nransfer tanggung jawab kanggo nangani pangecualian kanggo pangguna cara iki.
-
Ora dicenthang - pangecualian sing ora perlu ditangani, amarga ora dicenthang ing wektu kompilasi lan, minangka aturan, luwih ora bisa ditebak. Sing, prabédan utama karo dicenthang iku kanggo wong-wong mau iki nyoba-nyekel utawa mekanisme mbuwang padha, nanging padha ora prentah.
101. Tulis conto nyegat lan nangani pangecualian ing blok try-catch saka cara
try{ // начало блока перехвата
throw new Exception(); // ручной бросок исключения
} catch (Exception e) { // данное исключение и его потомки будут перехватываться
System.out.println("Упс, что-то пошло не так =("); // вывод некоторого исключения в консоль
}
102. Tulisen tuladha nyekel lan nangani pangecualian nggunakake pangecualianmu dhewe
Pisanan, ayo nulis kelas pangecualian dhewe, sing entuk warisan saka Exception lan ngilangi konstruktor kanthi pesen kesalahan:public class CustomException extends Exception {
public CustomException(final String message) {
super(message);
}
}
Inggih, banjur kita bakal mbuwang kanthi manual lan nyegat kaya ing pitakonan sadurunge:
try{
throw new CustomException("Упс, что-то пошло не так =(");
} catch (CustomException e) {
System.out.println(e.getMessage());
}
Lan maneh, nalika sampeyan mbukak, sampeyan bakal entuk output ing ngisor iki menyang konsol:
GO TO FULL VERSION