Praktek atau teori? Apa yang lebih penting? Banyak yang akan mengatakan bahwa tentu saja latihan lebih penting. Misalnya, berlatihlah sekeras yang Anda bisa dan Anda akan bahagia. Saya berani untuk tidak setuju dengan ini. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 8 - 1Selama wawancara, tidak ada yang akan tahu seberapa baik Anda berlatih. Anda akan ditanya secara lengkap persis sesuai teori. Dan hanya dengan begitu, ketika Anda telah melalui semua tahap wawancara dan masuk ke dalam proyek, Anda akan menggunakan keterampilan praktis Anda. Anda mungkin keberatan: terkadang mereka memberi Anda tugas ujian dan latihan tetap diperlukan. Saya tidak membantah, kadang-kadang diberikan, tetapi faktanya adalah TERKADANG, tetapi wawancara teoretis SELALU terjadi. Apakah Anda merasakan perbedaannya? Oleh karena itu, Anda harus memiliki landasan teori yang kokoh, yang akan terus kami perkuat saat ini. Yakni, kami akan terus menganalisis pertanyaan-pertanyaan yang sering ditanyakan saat wawancara.

71. Apa yang terjadi jika kita tidak mengganti metode toString() untuk Enum?

Katakanlah kita memiliki enum berikut :
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
Mari kita tampilkan siswa di konsol dengan memanggil toString() padanya :
System.out.println(Role.STUDENT.toString());
Hasil di konsol:
MURID
Artinya, secara default, toString() untuk enum adalah nama konstanta itu sendiri.

72. Apakah mungkin untuk menentukan konstruktor di dalam Enum?

Ya tentu. Melalui konstruktor nilai variabel enum internal ditetapkan. 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 pengembang Java yang paling umum. Mari kita mulai dengan fakta bahwa ketika kita membandingkan nilai sederhana ( int , char , double ...), kita melakukannya menggunakan == , karena variabel berisi nilai tertentu dan kita dapat membandingkannya. Dan variabel primitif bukanlah objek yang lengkap - mereka tidak mewarisi dari Object dan tidak memiliki metode yang sama dengan() . Ketika kita berbicara tentang membandingkan variabel yang merujuk pada objek, == hanya akan membandingkan nilai referensi - apakah mereka merujuk pada objek yang sama atau tidak. Dan meskipun suatu objek identik dengan objek lainnya, perbandingan melalui == akan memberikan hasil negatif ( false ), karena objek tersebut berbeda. Seperti yang Anda pahami, metode sama dengan() digunakan untuk membandingkan variabel referensi . Ini adalah salah satu metode standar kelas Object , yang diperlukan untuk perbandingan objek secara lengkap. Namun perlu segera diklarifikasi: agar metode ini berfungsi dengan benar, metode ini perlu didefinisikan ulang dengan menulis secara tepat bagaimana objek di kelas ini harus dibandingkan. Kecuali Anda mengganti metode ini, secara default metode ini akan membandingkan objek dengan == . Di IntelliJ IDEA , Anda dapat menimpanya secara otomatis (menggunakan alat IDEA) -> alt + insert , di jendela yang muncul, pilih sama dengan() dan hashCode() -> pilih bidang kelas mana yang harus berpartisipasi -> dan voila, implementasi otomatis metodenya selesai. Berikut adalah contoh tampilan metode sama dengan yang dihasilkan secara otomatis untuk kelas Cat 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);
}
Jika kita berbicara tentang perbedaan antara == dan sama dengan untuk enums , tidak banyak. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 8 - 2Lagi pula, enum menyimpan konstanta, dan bahkan ketika membandingkan nilai serupa menggunakan == , kita akan mendapatkan true karena referensi akan selalu mengarah ke objek yang sama. Nah, saat menggunakan yang sama, kita juga akan mengerjakan fungsinya dengan benar, terutama jika Anda masuk ke isi metode sama dengan untuk enum , Anda akan melihat bahwa di kelas Enum implementasi metodenya adalah sebagai berikut: Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 8 - 3Artinya, di dalam - perbandingan lama yang bagus dengan referensi! Untuk meringkas: untuk enum , perbandingan melalui == dan sama dengan adalah benar.Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 8 - 4

74. Apa yang dilakukan metode ordinal() di Enum?

Saat memanggil metode int ordinal() pada elemen enum , kita akan mendapatkan nomor urut dari nol dari nilai ini dalam rangkaian enumerasi umum. Mari kita gunakan metode ini pada satu elemen dari enum yang dibahas sebelumnya - Role :
System.out.println(Role.DIRECTOR.ordinal());
Oleh karena itu, konsol akan menampilkan:
2

75. Apakah mungkin menggunakan Enum dengan TreeSet atau TreeMap di Java?

Penggunaan tipe enum di TreeSet dan TreeMap dapat diterima. Dan kita dapat menulis:
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:
DIREKTUR GURU SISWA SECURITY_GUARD
Kami menerima keluaran tidak dalam urutan abjad. Intinya adalah jika kita menggunakan elemen enum untuk nilai TreeSet atau sebagai kunci untuk TreeMap , elemen-elemen tersebut akan diurutkan dalam urutan aslinya (urutan yang ditentukan dalam enum ). Memahami fitur-fitur ini membantu kami menulis kode yang lebih baik.Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 8 - 5

76. Bagaimana hubungan metode ordinal() dan CompareTo() di Enum?

Seperti yang dinyatakan sebelumnya, ordinal() mengembalikan nomor urut suatu nilai dalam daftar enumerasi umum. Selain itu, dalam analisis pertanyaan sebelumnya, Anda melihat bahwa elemen enumerasi, misalnya, sekali dalam TreeSet (kumpulan yang diurutkan) mengambil urutan deklarasinya dalam enum . Dan seperti yang kita ketahui, TreeSet dan TreeMap mengurutkan elemen dengan memanggil metode CompareTo() dari antarmuka Comparable . Dari sini kita dapat berasumsi bahwa kelas Enum mengimplementasikan antarmuka Sebanding , mengimplementasikannya dalam metode bandingkanTo() , di mana ordinal() digunakan untuk mengatur urutan pengurutan. Setelah memasuki kelas Enum , kita melihat konfirmasi ini: Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 8 - 6Dan isi dari metode itu sendiri: Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 8 - 7Metode ordinal() tidak dipanggil di sini. Sebagai gantinya, variabel ordinal digunakan - nomor urut elemen dalam enumerasi. Metode ordinal() sendiri tidak Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 8 - 8lebih dari pengambil variabel ordinal .

77. Tuliskan contoh EnumM

Pada soal-soal yang dibahas di atas, saya sudah memberikan contoh enum dan saya tidak melihat ada gunanya menduplikasi kode (misalnya pertanyaan nomor 72 tentang konstruktor di enum).

78. Apakah mungkin untuk menggunakan Enum dalam switch case?

Itu mungkin dan perlu! Melihat kembali praktik saya, saya perhatikan bahwa salah satu tempat paling umum untuk menggunakan enum adalah konstruksi logis seperti switch . Dalam hal ini, Anda dapat memberikan semua kemungkinan variasi case , dan setelah menulis logika untuk semua nilai enum - dan menggunakan operator default bahkan mungkin tidak diperlukan! Lagi pula, jika Anda menggunakan String atau nilai numerik, misalnya, bertipe int , Anda mungkin menerima nilai yang tidak diharapkan, yang pada gilirannya tidak mungkin dilakukan menggunakan enum . Seperti apa tampilan saklar pada contoh yang dibahas sebelumnya:
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // некая логика для STUDENT
           break;
       case TEACHER:
           // некая логика для TEACHER
           break;
       case DIRECTOR:
           // некая логика для DIRECTOR
           break;
       case SECURITY_GUARD:
           // некая логика для SECURITY_GUARD
           break;
   }
}

79. Bagaimana cara mendapatkan semua nilai yang tersedia dalam instance Enum?

Jika Anda perlu mendapatkan semua contoh enumerasi, ada metode value() yang mengembalikan array dari semua nilai yang tersedia dari enum tertentu dalam urutan alami (dalam urutan yang ditentukan dalam enum ). Contoh:
Role[] roles = Role.values();
for (Role role : roles) {
   System.out.println(role);
}
Konsol akan menampilkan output berikut:
DIREKTUR GURU SISWA SECURITY_GUARD

Aliran API

80.Apa itu Aliran di Jawa?

Java Stream adalah cara yang relatif baru untuk berinteraksi dengan aliran data, yang pada gilirannya memungkinkan Anda memproses data besar dengan lebih nyaman dan kompak, serta memparalelkan pemrosesan data antara sejumlah thread tertentu, yang dapat memberikan peningkatan kinerja dalam penggunaan. Kegunaan. Topik ini tidak dapat dibahas lebih dalam secara singkat, jadi di sini saya akan meninggalkan tautan ke artikel yang dapat membantu Anda mendalami topik ini.Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 8 - 9

81. Apa saja sifat utama transaksi?

Topiknya disebut Stream API, tetapi pertanyaannya adalah tentang transaksi. Hmm... Pertama, mari kita pahami dulu apa itu transaksi. Transaksi adalah sekelompok operasi database berurutan yang mewakili unit logis bekerja dengan data. Suatu transaksi dapat diselesaikan secara keseluruhan dan berhasil, menjaga integritas data dan independen dari transaksi lain yang berjalan secara paralel, atau transaksi tersebut tidak dapat diselesaikan sama sekali, dalam hal ini transaksi tersebut tidak berpengaruh. Jadi, transaksi memiliki empat sifat utama, yang disingkat ACID . Mari kita lihat singkatan setiap huruf dari singkatan ini: A - Atomicity - atomisitas - properti ini menjamin bahwa tidak ada transaksi yang akan dicatat sebagian dalam sistem. Semua sub-operasinya akan dilakukan, atau tidak ada satu pun yang akan dilakukan ( semua atau tidak sama sekali ). C - Konsistensi - konsistensi adalah properti yang memastikan bahwa setiap transaksi yang berhasil hanya mencatat hasil yang valid. Artinya, ini adalah jaminan bahwa jika transaksi berhasil, semua aturan dan batasan yang diberlakukan sistem pada data tertentu akan terpenuhi, jika tidak, transaksi tidak akan selesai dan data dalam sistem akan kembali ke kondisi sebelumnya. negara. I - Isolasi - isolasi adalah properti yang menyatakan bahwa selama pelaksanaan suatu transaksi, transaksi paralel tidak boleh mempengaruhi hasilnya. Properti ini membutuhkan banyak sumber daya, sehingga biasanya diterapkan sebagian dengan mengizinkan tingkat isolasi tertentu yang memecahkan masalah isolasi tertentu. Kami akan membahas ini lebih detail pada pertanyaan berikutnya. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 8 - 10D - Daya Tahan - properti ini memastikan bahwa jika pengguna telah menerima konfirmasi dari sistem bahwa transaksi telah selesai, ia dapat yakin bahwa perubahan yang dilakukannya tidak akan dibatalkan karena suatu kegagalan. Artinya, Anda dapat yakin bahwa beberapa jenis kegagalan sistem operasi tidak akan berdampak apa pun terhadap data Anda jika Anda telah menerima konfirmasi keberhasilan penyelesaian transaksi Anda.

82. Berapa tingkat isolasi transaksinya?

Seperti yang saya katakan sebelumnya, menyediakan isolasi ACID adalah proses yang membutuhkan banyak sumber daya. Oleh karena itu, properti ini terpenuhi sebagian. Terdapat berbagai tingkat isolasi, dan semakin tinggi tingkat isolasi, semakin besar dampaknya terhadap produktivitas. Sebelum beralih ke tingkat isolasi transaksi, kita perlu melihat berbagai masalah isolasi transaksi yang tidak mencukupi :
  • pembacaan hantu - ketika sampel yang sama (kueri yang sama) dipanggil berulang kali dalam transaksi yang sama, data yang diterima berbeda, yang terjadi karena penyisipan data oleh transaksi lain;

  • pembacaan tidak berulang - ketika sampel yang sama (kueri yang sama) dipanggil berulang kali dalam transaksi yang sama, data yang diterima berbeda, yang terjadi karena perubahan (pembaruan) dan penghapusan data oleh transaksi lain;

  • pembacaan kotor - proses membaca data yang ditambahkan atau diubah oleh suatu transaksi yang kemudian tidak dikonfirmasi (diputar kembali), mis. membaca data yang tidak valid;

  • pembaruan yang hilang - ketika transaksi yang berbeda mengubah data yang sama pada saat yang sama, semua perubahan kecuali yang terakhir akan hilang (mengingatkan pada masalah "kondisi balapan" di lingkungan multi-thread).

Tingkat isolasi transaksi dicirikan oleh masalah isolasi apa yang dilindungi. Mari kita pertimbangkan dalam bentuk tabel tingkat insulasi dan masalah apa yang dilindunginya:
Tingkat isolasi Pembacaan hantu Membaca tidak berulang-ulang Bacaan kotor Pembaruan hilang
DAPAT DISERIALKAN + + + +
BACAAN YANG DAPAT DIULANG - + + +
BACA BERKOMITMEN - - + +
BACA TANPA KOMITMEN - - - +
TIDAK ADA - - - -
Dan jangan lupa sisi lainnya: semakin tinggi tingkat isolasi, semakin lama waktu yang dibutuhkan untuk memproses transaksi (jika beberapa transaksi dieksekusi secara paralel). Jika Anda ingin menggali lebih dalam topik ini, inilah artikel bagus untuk Anda mulai.

83. Apa perbedaan antara Pernyataan dan Pernyataan yang Disiapkan?

Dan di sini transisi ke fitur teknologi JDBC tidak terlalu mulus . Jadi, pertama-tama, mari kita cari tahu apa sebenarnya Statement itu . Ini adalah objek yang digunakan untuk menghasilkan kueri SQL. JDBC menggunakan tiga tipe - Statement , PreparedStatement dan CallableStatement . Kita tidak akan membahas CallableStatement hari ini: mari kita bahas perbedaan antara Statement dan PreparedStatement .
  1. Pernyataan digunakan untuk mengeksekusi kueri SQL sederhana tanpa parameter masuk yang dimasukkan secara dinamis. PrepareStatement digunakan dengan kemampuan untuk memasukkan parameter input secara dinamis.

  2. Untuk mengatur parameter di PreparedStatement, parameter input dalam permintaan ditulis sebagai tanda tanya, sehingga nilai kemudian dapat dimasukkan menggunakan berbagai setter, seperti setDouble() , setFloat() , setInt() , setTime() ... . Hasilnya, Anda tidak akan memasukkan tipe data yang salah ke dalam kueri Anda.

  3. PreparedStatement sudah “dikompilasi” dan menggunakan caching, sehingga eksekusinya bisa sedikit lebih cepat daripada membuat kueri dari objek Statement . Akibatnya, kueri SQL yang sering dieksekusi ditulis sebagai objek PreparedStatement untuk meningkatkan kinerja .

  4. Pernyataan rentan terhadap injeksi SQL, sementara PreparedStatement mencegahnya. Baca selengkapnya tentang menghilangkan injeksi SQL dan praktik terbaik lainnya dalam keamanan Java di artikel ini .

Jika Anda mulai mempelajari teknologi menghubungkan aplikasi Java ke Database - JDBC, saya menyarankan Anda untuk memulai dengan artikel ini . Nah, pada poin ini kita akan berhenti pada hari ini.Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 8 - 11