
71. Apakah yang berlaku jika kita tidak mengatasi kaedah toString() Enum?
Katakan kita mempunyai enum berikut :public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
Mari paparkan medan PELAJAR pada konsol dengan memanggil kaedah toString() nya:
System.out.println(Role.STUDENT.toString());
Akibatnya, kami mendapat output konsol berikut:
72. Bolehkah anda mengisytiharkan pembina di dalam Enum?
Ya sudah tentu. Pembina ialah apa yang menetapkan nilai medan dalaman enum . Sebagai contoh, mari tambah dua medan pada enum sebelumnya ( ageFrom dan ageTo ) untuk menunjukkan julat umur bagi setiap peranan:public enum Role {
STUDENT(5,18),
TEACHER(20,60),
DIRECTOR(40,70),
SECURITY_GUARD(18,50);
int ageFrom;
int ageTo;
Role(int ageFrom, int ageTo) {
this.ageFrom = ageFrom;
this.ageTo = ageTo;
}
}
73. Apakah perbezaan antara == dan equals()?
Ini adalah salah satu soalan wawancara yang paling biasa ditanya kepada bakal pembangun Java. Sebagai permulaan, apabila membandingkan nilai mudah ( int , char , double ...), kami menggunakan == , kerana pembolehubah ini mengandungi nilai konkrit yang boleh dibandingkan secara langsung. Lebih-lebih lagi, pembolehubah primitif bukanlah objek sepenuhnya — mereka tidak mewarisi kelas Objek dan tidak mempunyai kaedah equals() . Jika kita bercakap tentang membandingkan pembolehubah yang merujuk kepada objek, maka kita perlu tahu bahawa == hanya membandingkan nilai rujukan, iaitu sama ada ia merujuk kepada objek yang sama atau tidak. Walaupun semua data dalam satu objek adalah sama dengan semua data dalam satu lagi, menggunakan == untuk perbandingan akan menghasilkan hasil negatif ( false ), kerana ia adalah objek berasingan. Seperti yang anda mungkin telah meneka, kami menggunakan kaedah equals() untuk membandingkan pembolehubah rujukan. Ini adalah salah satu kaedah standard kelas Objek , dan diperlukan untuk perbandingan lengkap objek. Tetapi saya perlu segera mengatakan bahawa untuk kaedah ini berfungsi dengan betul, ia mesti ditindih untuk menunjukkan dengan tepat bagaimana objek harus dibandingkan. Jika anda tidak mengatasi kaedah, maka anda akan mendapat pelaksanaan lalai, yang membandingkan objek menggunakan == . Dalam IntelliJ IDEA, anda boleh mengatasinya secara automatik menggunakan pintasan IDEA: Alt+Insert . Dalam tetingkap yang muncul, pilih equals() dan hashCode() . Kemudian pilih medan yang sepatutnya terlibat. Voila! Kaedah dilaksanakan secara automatik. Berikut ialah contoh cara kaedah sama yang dijana secara automatik mencari kelas Cat yang paling mudah dengan dua medan — umur int dan nama String :@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || this.getClass() != o.getClass()) return false;
final Cat cat = (Cat) o;
return this.age == cat.age &&
Objects.equals(this.name, cat.name);
}
Apabila ia datang kepada enum , tidak ada perbezaan praktikal antara == dan equals() . 


74. Apakah yang dilakukan oleh kaedah ordinal() Enum?
Apabila kita memanggil kaedah int ordinal() pada medan enum , kita mendapat indeks berasaskan sifar medan dalam senarai nilai enum. Mari kita panggil kaedah ini pada medan dalam enum Peranan , yang sebelum ini kita pertimbangkan:System.out.println(Role.DIRECTOR.ordinal());
Sehubungan itu, konsol memaparkan:
75. Bolehkah Enum digunakan dengan TreeSet atau TreeMap dalam Java?
Kita boleh menggunakan jenis enum dalam TreeSet dan TreeMap . Dan kita boleh menulis ini:TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
Dan konsol akan memaparkan:
76. Bagaimanakah kaedah ordinal() dan compareTo() Enum berkaitan?
Seperti yang dinyatakan sebelum ini, ordinal() mengembalikan indeks medan dalam senarai medan enum. Selain itu, dalam pertimbangan kami terhadap soalan sebelumnya, anda melihat bahawa apabila medan enum dimasukkan ke dalam TreeSet (yang merupakan set yang diisih), mereka mengambil urutan di mana ia diisytiharkan dalam enum . Dan seperti yang kita tahu, TreeSet dan TreeMap mengisih item dengan memanggil kaedah compareTo() antara muka Sebanding mereka . Ini memberitahu kami bahawa kelas Enum melaksanakan antara muka Sebanding , yang bermaksud ia melaksanakan kaedah compareTo() , yang secara dalaman menggunakan kaedah ordinal() untuk menentukan susunan isihan. Masuk ke kelas Enum , kami boleh mengesahkan andaian kami:


77. Tulis satu contoh Enum
Dalam soalan yang dibincangkan di atas, saya telah memberikan contoh enum s. Saya tidak nampak sebab untuk menduplikasi kod di sini. Sebagai contoh, lihat Soalan 72 mengenai pembina dalam enum.78. Bolehkah Enum digunakan dalam kotak suis?
Ia boleh dan sepatutnya! Melihat pengalaman saya, saya akan perhatikan bahawa salah satu penggunaan enum yang paling biasa adalah dalam binaan logik seperti pernyataan suis . Dalam kes ini, anda boleh menyediakan semua kemungkinan kes — sebaik sahaja anda menulis logik untuk setiap medan enum , anda tidak memerlukan klausa lalai ! Lagipun, jika anda menggunakan String atau nilai angka, seperti int , anda mungkin menerima nilai yang tidak dijangka, tetapi itu adalah mustahil dengan enum . Berikut ialah rupa pernyataan suis untuk contoh di atas:public void doSomething(Role role) {
switch (role) {
case STUDENT:
// some logic for STUDENT
break;
case TEACHER:
// some logic for TEACHER
break;
case DIRECTOR:
// some logic for DIRECTOR
break;
case SECURITY_GUARD:
// some logic for SECURITY_GUARD
break;
}
}
79. Bagaimanakah saya boleh mendapatkan semua kemungkinan nilai Enum?
Jika anda perlu mendapatkan semua nilai enum yang mungkin, terdapat kaedah values() , yang mengembalikan tatasusunan semua nilai yang mungkin untuk enum dalam susunan semula jadinya (iaitu, dalam susunan yang dinyatakan dalam enum ) . Contoh:Role[] roles = Role.values();
for (Role role : roles) {
System.out.println(role);
}
Kami akan mempunyai berikut pada konsol:
API Strim
80. Apakah itu Aliran di Jawa?
Java Stream API ialah cara yang agak baharu untuk berinteraksi dengan aliran data, membolehkan kami memproses data besar dengan lebih mudah dan padat, serta memproses data secara selari antara beberapa strim, yang berpotensi meningkatkan prestasi.81. Namakan sifat utama urus niaga
Topik di sini ialah API Strim, tetapi persoalannya ialah mengenai transaksi. Hmm... Mula-mula, mari kita fahami apa itu transaksi. Transaksi ialah sekumpulan operasi berurutan pada pangkalan data . Ia mewakili unit kerja yang logik. Sesuatu urus niaga boleh dilaksanakan secara bebas daripada urus niaga serentak lain sama ada sepenuhnya dan berjaya, dengan itu mengekalkan integriti data, atau tidak dilaksanakan sama sekali, dalam hal ini ia tidak mempunyai kesan. Urus niaga mempunyai empat sifat utama, yang boleh kita ingat dengan mudah terima kasih kepada akronim ACID . Mari lihat maksud setiap huruf bagi akronim ini: A adalah singkatan kepada Atomicity . Harta ini menjamin bahawa tiada transaksi dilakukan sebahagiannya dalam sistem. Sama ada semua suboperasinya akan dilaksanakan, atau tiada satu pun daripadanya akan dilaksanakan ( semua atau tiada ). С bermaksud Konsistensi . Harta ini menjamin bahawa setiap transaksi yang berjaya hanya akan menghasilkan hasil yang sah. Dengan kata lain, ini adalah jaminan bahawa jika transaksi berjaya, maka semua peraturan sistem untuk data tertentu akan dipatuhi. Jika transaksi tidak berjaya, maka ia tidak akan dilaksanakan dan data sistem akan kembali ke keadaan sebelumnya. Saya bermaksud Pengasingan . Harta ini bermakna apabila urus niaga dilaksanakan, urus niaga serentak tidak boleh menjejaskan hasilnya. Harta ini intensif sumber, jadi, sebagai peraturan, ia dilaksanakan sebahagiannya, membenarkan tahap pengasingan tertentu yang menyelesaikan masalah pengasingan tertentu. Kami akan membincangkan perkara ini dengan lebih terperinci dalam soalan seterusnya. D bermaksud Ketahanan . Harta ini menjamin bahawa jika pengguna menerima pengesahan bahawa transaksi telah selesai, maka dia boleh yakin bahawa perubahan itu tidak akan dibatalkan kerana beberapa kegagalan. Iaitu, anda boleh yakin bahawa beberapa kegagalan sistem pengendalian tidak akan melakukan apa-apa kepada data anda jika anda telah menerima pengesahan bahawa transaksi anda berjaya diselesaikan.82. Apakah tahap pengasingan transaksi?
Seperti yang saya katakan sebelum ini, apabila ia berkaitan dengan sifat ACID, memastikan pengasingan adalah proses intensif sumber. Sehubungan itu, harta ini sebahagiannya dilaksanakan. Terdapat tahap pengasingan yang berbeza: lebih tinggi tahap, lebih teruk kesan ke atas prestasi. Sebelum kita beralih ke tahap pengasingan transaksi, kita perlu mempertimbangkan pelbagai masalah yang berlaku disebabkan pengasingan transaksi yang tidak mencukupi :-
phantom berbunyi : apabila permintaan yang sama, dipanggil lebih daripada sekali dalam satu transaksi, menghasilkan keputusan yang berbeza disebabkan oleh sisipan oleh transaksi lain;
-
nonrepeatable reads : apabila permintaan yang sama, dipanggil lebih daripada sekali dalam satu transaksi, menghasilkan data yang berbeza disebabkan oleh perubahan (kemas kini) dan pemadaman oleh transaksi lain;
-
bacaan kotor : membaca data yang belum dikomitkan yang telah ditambah atau diubah suai oleh transaksi dan kemudiannya digulung semula;
-
kemas kini hilang : apabila satu blok data ditukar secara serentak oleh transaksi yang berbeza, dan semua perubahan kecuali yang terakhir hilang (serupa dengan keadaan perlumbaan dalam multithreading).
Tahap pengasingan | Hantu membaca | Bacaan tidak boleh diulang | Bacaan kotor | Kemas kini hilang |
---|---|---|---|---|
BOLEH BERSIRI | + | + | + | + |
BACA DIULANG | - | + | + | + |
BACA KOMITED | - | - | + | + |
BACA TAK KOMITED | - | - | - | + |
TIADA | - | - | - | - |
83. Apakah perbezaan antara Penyata dan Penyata Disediakan?
Di sini kami telah menukar peralihan kepada ciri JDBC secara tiba-tiba . Walau apa pun, mari kita fikirkan dahulu apa itu Pernyataan . Ia adalah objek yang digunakan untuk membentuk pertanyaan SQL. JDBC menggunakan tiga jenis: Statement , PreparedStatement , dan CallableStatement . Kami tidak akan mempertimbangkan CallableStatement hari ini. Sebaliknya, kita bercakap tentang perbezaan antara Statement dan PreparedStatement .-
Pernyataan digunakan untuk melaksanakan pertanyaan SQL mudah tanpa parameter input masa jalan. PrepareStatement boleh menerima parameter input semasa runtime.
-
Untuk menetapkan parameter untuk PreparedStatement , parameter input ditulis sebagai tanda soal dalam permintaan, jadi ia boleh digantikan dengan beberapa nilai menggunakan pelbagai setters, seperti setDouble() , setFloat() , setInt() , setTime() ... Ini bermakna anda tidak akan memasukkan jenis data yang salah ke dalam permintaan.
-
PreparedStatement diprakompil dan menggunakan caching, jadi ia boleh dilaksanakan lebih cepat sedikit daripada permintaan yang dibuat terhadap objek Pernyataan . Akibatnya, penyataan SQL yang kerap dilaksanakan dibuat sebagai objek PreparedStatement untuk meningkatkan prestasi.
-
Kenyataan terdedah kepada suntikan SQL, tetapi PreparedStatement menghalangnya.
GO TO FULL VERSION