CodeGym/Java Blog/Acak/Menjelajahi pertanyaan dan jawaban dari wawancara kerja u...
John Squirrels
Level 41
San Francisco

Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java. Bagian 8

Dipublikasikan di grup Acak
anggota
Praktek atau teori? Apa yang lebih penting? Banyak orang secara alami akan mengatakan bahwa latihan itu lebih penting. Misalnya, berlatihlah sampai matahari terbenam dan Anda akan bahagia. Saya berani untuk tidak setuju dengan ini. Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 8 - 1Selama wawancara, tidak akan ada yang tahu betapa kerennya Anda saat berlatih. Sebaliknya, Anda akan diminta untuk mendemonstrasikan teori Anda. Baru setelah Anda melewati semua lapisan wawancara dan ditugaskan pada suatu proyek, Anda baru akan menerapkan keterampilan praktis Anda. Anda mungkin keberatan, dengan mengatakan terkadang mereka memberi Anda tugas ujian, jadi latihan tetap diperlukan. Saya bukannya tidak setuju, tapi maksud saya adalah ini TERKADANG, tapi Anda SELALU perlu menunjukkan pengetahuan teori dalam sebuah wawancara. Apakah Anda merasakan perbedaannya? Semua ini berarti Anda harus memiliki landasan teoritis yang kuat, dan itulah yang akan terus kami bangun hari ini. Lebih khusus lagi, kami akan terus melihat pertanyaan-pertanyaan yang sering ditanyakan dalam wawancara.

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:
MURID
Jadi, kita melihat bahwa untuk enum , implementasi default toString() mengembalikan nama konstanta itu sendiri.

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() . Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 8 - 2Lagi pula, enum menyimpan konstanta, dan bahkan ketika kita membandingkan nilai yang identik menggunakan == , kita akan mendapatkan true , karena referensi yang dibandingkan akan selalu menunjuk ke objek yang sama. Dan menggunakan equal() memberi kita hasil yang benar juga. Jika Anda masuk ke isi metode sama dengan Enum , Anda akan melihat bahwa kelas Enum memiliki implementasi berikut: Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 8 - 3Di dalamnya kita dapat melihat perbandingan referensi lama yang bagus! Ringkasnya, untuk enum s, kita dapat membandingkan dengan benar menggunakan == dan equal() . Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 8 - 4

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:
2

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:
DIREKTUR GURU SISWA SECURITY_GUARD
Kami mendapatkan hasilnya, tetapi tidak berdasarkan abjad. Intinya adalah jika kita menggunakan bidang enum sebagai nilai TreeSet atau sebagai kunci TreeMap , maka bidang tersebut akan diurutkan menurut urutan aslinya (dalam urutan yang ditentukan dalam enum ) . Memahami bahwa cara kerjanya membantu kita menulis kode yang lebih baik.

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: Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 8 - 5Dan inilah inti dari metode itu sendiri: Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 8 - 6Metode ordinal() tidak dipanggil di sini. Sebagai gantinya, variabel ordinal digunakan, yaitu nomor indeks elemen dalam pencacahan. Metode ordinal() sendiri Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 8 - 7 tidak lebih dari pengambil variabel ordinal .

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:
DIREKTUR GURU SISWA SECURITY_GUARD

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).

Pada kenyataannya, tingkat isolasi transaksi dicirikan oleh masalah isolasi apa yang dilindungi. Perhatikan tabel tingkat isolasi berikut dan masalah yang dilindungi:
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 - - - -
Dan jangan lupa sisi sebaliknya: semakin tinggi tingkat isolasi, semakin lama waktu yang dibutuhkan untuk memproses transaksi (mengingat eksekusi paralel beberapa transaksi).

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 .
  1. Pernyataan digunakan untuk mengeksekusi query SQL sederhana tanpa parameter input runtime. PrepareStatement dapat menerima parameter input saat runtime.

  2. 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.

  3. 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.

  4. Pernyataan rentan terhadap injeksi SQL, tetapi PreparedStatement mencegahnya.

Dan dengan itu, kita akan mengakhirinya!
Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar