
71. Apa yang terjadi jika kita tidak mengganti metode toString() Enum?
Misalkan kita memiliki enum berikut :
public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
Mari kita tampilkan field STUDENT di konsol dengan memanggil metode toString() :
System.out.println(Role.STUDENT.toString());
Hasilnya, kami mendapatkan keluaran konsol berikut:
72. Bisakah Anda mendeklarasikan konstruktor di dalam Enum?
Ya, tentu saja. Konstruktor inilah yang menetapkan nilai bidang internal enum . Sebagai contoh, mari tambahkan dua kolom ke enum sebelumnya ( ageFrom dan ageTo ) untuk menunjukkan rentang usia untuk setiap peran:
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. Apa perbedaan antara == dan sama dengan()?
Ini adalah salah satu pertanyaan wawancara paling umum yang ditanyakan calon pengembang Java. Untuk memulainya, ketika membandingkan nilai-nilai sederhana ( int , char , double ...), kita menggunakan == , karena variabel-variabel ini berisi nilai-nilai konkrit yang dapat dibandingkan secara langsung. Terlebih lagi, variabel primitif bukanlah objek yang lengkap — mereka tidak mewarisi kelas Object dan tidak memiliki metode sama dengan() . Jika kita berbicara tentang membandingkan variabel yang merujuk pada objek, maka kita perlu mengetahui bahwa == hanya membandingkan nilai referensinya, yaitu apakah mereka merujuk pada objek yang sama atau tidak. Bahkan jika semua data dalam satu objek identik dengan semua data di objek lain, penggunaan == sebagai perbandingan akan menghasilkan hasil negatif ( false ), karena keduanya merupakan objek yang terpisah. Seperti yang sudah Anda duga, kami menggunakan metode sama dengan() untuk membandingkan variabel referensi. Ini adalah salah satu metode standar kelas Object , dan diperlukan untuk perbandingan objek secara menyeluruh. Tetapi saya harus segera mengatakan bahwa agar metode ini berfungsi dengan benar, metode ini harus ditimpa untuk menunjukkan dengan tepat bagaimana objek harus dibandingkan. Jika Anda tidak mengganti metode ini, maka Anda akan mendapatkan implementasi default, yang membandingkan objek menggunakan == . Di IntelliJ IDEA, Anda dapat menimpanya secara otomatis menggunakan pintasan IDEA: Alt+Insert . Di jendela yang muncul, pilih sama dengan() dan hashCode() . Kemudian pilih bidang yang harus dilibatkan. Voila! Metode diterapkan secara otomatis. Berikut adalah contoh bagaimana metode sama dengan yang dihasilkan secara otomatis mencari kelas Cat yang paling sederhana dengan dua bidang — int age dan String name :
@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);
}
Terkait enum , tidak ada perbedaan praktis antara == dan equal() . 


74. Apa yang dilakukan metode ordinal() Enum?
Saat kita memanggil metode int ordinal() pada bidang enum , kita mendapatkan indeks berbasis nol dari bidang tersebut dalam daftar nilai enum. Mari kita panggil metode ini pada bidang di enum Peran , yang sebelumnya kita pertimbangkan:
System.out.println(Role.DIRECTOR.ordinal());
Oleh karena itu, konsol menampilkan:
75. Bisakah Enum digunakan dengan TreeSet atau TreeMap di Java?
Kita dapat menggunakan tipe enum di TreeSet dan TreeMap . Dan kita dapat 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 menampilkan:
76. Bagaimana hubungan metode ordinal() dan bandingkanTo() Enum?
Seperti disebutkan sebelumnya, ordinal() mengembalikan indeks bidang dalam daftar bidang enum. Selain itu, dalam pertimbangan kami atas pertanyaan sebelumnya, Anda melihat bahwa ketika bidang enum dimasukkan ke dalam TreeSet (yang merupakan kumpulan yang diurutkan), bidang tersebut mengambil urutan deklarasinya dalam enum . Dan seperti yang kita ketahui, TreeSet dan TreeMap mengurutkan item dengan memanggil metode CompareTo() pada antarmuka Comparable- nya . Ini memberitahu kita bahwa kelas Enum mengimplementasikan antarmuka Comparable , yang berarti mengimplementasikan metode bandingkanTo() , yang secara internal menggunakan metode ordinal() untuk menentukan urutan pengurutan. Masuk ke kelas Enum , kita dapat mengkonfirmasi asumsi kita:


77. Tuliskan contoh Enum
Pada pertanyaan yang dibahas di atas, saya sudah memberikan contoh enum s. Saya tidak melihat alasan untuk menduplikasi kode di sini. Misalnya, lihat Pertanyaan 72 mengenai konstruktor dalam enum.78. Bisakah Enum digunakan dalam switch case?
Itu bisa dan seharusnya! Melihat pengalaman saya, saya akan mencatat bahwa salah satu penggunaan enum yang paling umum adalah dalam konstruksi logis seperti pernyataan switch . Dalam hal ini, Anda dapat memberikan semua kemungkinan kasus — setelah Anda menulis logika untuk setiap bidang enum , Anda bahkan tidak memerlukan klausa default ! Lagi pula, jika Anda menggunakan String atau nilai numerik, seperti int , Anda mungkin menerima nilai yang tidak diharapkan, tetapi hal itu tidak mungkin dilakukan dengan enum . Berikut tampilan pernyataan switch pada 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. Bagaimana cara mendapatkan semua kemungkinan nilai Enum?
Jika Anda perlu mendapatkan semua kemungkinan nilai enum, ada metode value() yang mengembalikan array berisi semua kemungkinan nilai enum dalam urutan aslinya (yaitu, dalam urutan yang ditentukan dalam enum ). Contoh:
Role[] roles = Role.values();
for (Role role : roles) {
System.out.println(role);
}
Kami akan mengikuti di konsol:
Aliran API
80. Apa itu Aliran di Jawa?
Java Stream API adalah cara yang relatif baru untuk berinteraksi dengan aliran data, memungkinkan kita memproses data besar dengan lebih mudah dan kompak, serta memproses data secara paralel di antara sejumlah aliran, sehingga berpotensi meningkatkan kinerja.81. Sebutkan sifat-sifat utama transaksi
Topiknya di sini adalah Stream API, tetapi pertanyaannya adalah tentang transaksi. Hmm... Pertama, mari kita pahami dulu apa itu transaksi. Transaksi adalah sekelompok operasi berurutan pada database . Ini mewakili unit kerja yang logis. Suatu transaksi dapat dieksekusi secara independen dari transaksi bersamaan lainnya baik secara keseluruhan dan berhasil, sehingga integritas data tetap terjaga, atau tidak dieksekusi sama sekali, dalam hal ini tidak ada pengaruhnya. Transaksi memiliki empat properti utama, yang mudah kita ingat berkat akronim ACID . Mari kita lihat arti setiap huruf dari akronim ini: A adalah singkatan dari Atomicity . Properti ini menjamin bahwa tidak ada transaksi yang dilakukan sebagian dalam sistem. Semua suboperasinya akan dieksekusi, atau tidak satupun yang akan dieksekusi ( semua atau tidak sama sekali ). С adalah singkatan dari Konsistensi . Properti ini menjamin bahwa setiap transaksi yang berhasil hanya akan memberikan hasil yang valid. Dengan kata lain, ini merupakan jaminan bahwa jika transaksi berhasil, maka seluruh aturan sistem untuk data tertentu akan dipatuhi. Jika transaksi tidak berhasil maka tidak akan dieksekusi dan data sistem akan kembali ke keadaan semula. Saya singkatan dari Isolasi . Properti ini berarti bahwa ketika suatu transaksi dieksekusi, transaksi bersamaan tidak boleh mempengaruhi hasilnya. Properti ini membutuhkan banyak sumber daya, sehingga biasanya diterapkan sebagian, sehingga memungkinkan tingkat isolasi tertentu yang memecahkan masalah isolasi tertentu. Kami akan membahas ini lebih detail di pertanyaan berikutnya. D adalah singkatan dari Daya Tahan . Properti ini menjamin bahwa jika pengguna menerima konfirmasi bahwa transaksi telah selesai, maka dia dapat yakin bahwa perubahan tidak akan dibatalkan karena suatu kegagalan. Artinya, Anda dapat yakin bahwa beberapa kegagalan sistem operasi tidak akan berdampak apa pun terhadap data Anda jika Anda telah menerima konfirmasi bahwa transaksi Anda berhasil diselesaikan.82. Berapa tingkat isolasi transaksinya?
Seperti yang saya katakan sebelumnya, jika menyangkut properti ACID, memastikan isolasi adalah proses yang membutuhkan banyak sumber daya. Oleh karena itu, properti ini telah dilaksanakan sebagian. Terdapat berbagai tingkat isolasi: semakin tinggi tingkatnya, semakin parah dampaknya terhadap kinerja. Sebelum kita beralih ke tingkat isolasi transaksi, kita perlu mempertimbangkan berbagai masalah yang terjadi karena isolasi transaksi yang tidak memadai :-
phantom reads : ketika permintaan yang sama, dipanggil lebih dari satu kali dalam satu transaksi, menghasilkan hasil yang berbeda karena penyisipan oleh transaksi lain;
-
pembacaan yang tidak dapat diulang : ketika permintaan yang sama, dipanggil lebih dari satu kali dalam satu transaksi, menghasilkan data yang berbeda karena perubahan (pembaruan) dan penghapusan oleh transaksi lain;
-
pembacaan kotor : membaca data yang belum dikomit yang telah ditambahkan atau diubah oleh suatu transaksi dan kemudian dibatalkan;
-
pembaruan yang hilang : ketika satu blok data diubah secara bersamaan oleh transaksi yang berbeda, dan semua perubahan kecuali yang terakhir hilang (mirip dengan kondisi balapan di multithreading).
Tingkat isolasi | Hantu membaca | Bacaan yang tidak dapat diulang | Bacaan kotor | Pembaruan hilang |
---|---|---|---|---|
DAPAT DISERIALKAN | + | + | + | + |
BACAAN YANG DAPAT DIULANG | - | + | + | + |
BACA BERKOMITMEN | - | - | + | + |
BACA TANPA KOMITMEN | - | - | - | + |
TIDAK ADA | - | - | - | - |
83. Apa perbedaan antara Pernyataan dan Pernyataan yang Disiapkan?
Di sini kami tiba-tiba mengubah transisi ke fitur JDBC . Bagaimanapun, pertama-tama mari kita cari tahu apa sebenarnya Pernyataan itu. Ini adalah objek yang digunakan untuk membentuk kueri SQL. JDBC menggunakan tiga jenis: Statement , PreparedStatement , dan CallableStatement . Kami tidak akan mempertimbangkan CallableStatement hari ini. Sebaliknya, kita berbicara tentang perbedaan antara Statement dan PreparedStatement .-
Pernyataan digunakan untuk mengeksekusi query SQL sederhana tanpa parameter input runtime. PrepareStatement dapat menerima parameter input saat runtime.
-
Untuk mengatur parameter PreparedStatement , parameter input ditulis sebagai tanda tanya dalam permintaan, sehingga dapat diganti dengan beberapa nilai menggunakan berbagai setter, seperti setDouble() , setFloat() , setInt() , setTime() ... Ini berarti Anda tidak akan memasukkan tipe data yang salah ke dalam permintaan.
-
PreparedStatement telah dikompilasi sebelumnya dan menggunakan caching, sehingga dapat dieksekusi sedikit lebih cepat dibandingkan permintaan yang dibuat pada objek Statement . Akibatnya, pernyataan SQL yang sering dieksekusi dibuat sebagai objek PreparedStatement untuk meningkatkan kinerja.
-
Pernyataan rentan terhadap injeksi SQL, tetapi PreparedStatement mencegahnya.
GO TO FULL VERSION