JavaRush /Java Blog /Random-ID /Analisis tanya jawab dari wawancara untuk pengembang Java...

Analisis tanya jawab dari wawancara untuk pengembang Java. Bagian 11

Dipublikasikan di grup Random-ID
Halo! Bahkan kapal tercepat yang tidak memiliki jalur akan hanyut begitu saja di tengah ombak. Jika Anda membaca artikel saya sekarang, Anda pasti punya tujuan. Hal utama adalah jangan tersesat, tetapi ikuti garis Anda sampai akhir - menjadi pengembang Java. Hari ini saya ingin melanjutkan analisis saya terhadap 250+ pertanyaan untuk pengembang Java, yang akan membantu Anda menutupi beberapa kesenjangan dalam teori. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 11 - 1

97. Apakah ketentuan redefinisi perjanjian diberlakukan ketika mendefinisikan ulang Setara?

Metode sama dengan() yang diganti harus mematuhi ketentuan (aturan) berikut:
  • refleksivitas - untuk nilai apa pun x, ekspresi seperti x.equals(x) harus selalu menghasilkan nilai true (bila x != null ).

  • simetri - untuk nilai x dan y apa pun, ekspresi dalam bentuk x.equals(y) harus mengembalikan nilai true hanya jika y.equals(x) mengembalikan true .

  • transitivitas - untuk nilai x , y dan z , jika x.equals(y) mengembalikan true dan y.equals(z) juga mengembalikan true , maka x.equals(z) harus mengembalikan true .

  • konsistensi - untuk nilai x dan y apa pun, panggilan berulang ke x.equals(y) akan selalu mengembalikan nilai panggilan sebelumnya ke metode ini, asalkan bidang yang digunakan untuk membandingkan kedua objek tidak berubah di antara panggilan .

  • perbandingan null - untuk nilai apa pun x, memanggil x.equals(null) akan mengembalikan false .

98. Apa yang terjadi jika Anda tidak mengganti Equals dan HashCode?

Dalam hal ini, hashCode() akan mengembalikan nomor yang dihasilkan berdasarkan lokasi memori di mana objek tertentu disimpan. Artinya, dua objek dengan bidang yang persis sama akan menerima nilai yang berbeda saat memanggil kode hash() yang tidak diganti (bagaimanapun juga, keduanya disimpan di lokasi memori yang berbeda). Equal() yang tidak diganti membandingkan referensi untuk melihat apakah referensi tersebut menunjuk ke objek yang sama atau tidak. Artinya, perbandingan dilakukan melalui == , dan dalam kasus objek dengan bidang yang sama maka akan selalu menghasilkan false . Benar hanya akan terjadi ketika membandingkan referensi ke objek yang sama. Terkadang ada logika untuk tidak mengesampingkan metode ini. Misalnya, Anda ingin semua objek dari kelas tertentu menjadi unik dan mengganti metode ini hanya akan merusak logika keunikan. Hal utama adalah memahami nuansa metode yang diganti dan tidak diganti dan menggunakan kedua pendekatan tersebut tergantung pada situasinya.

99. Mengapa simetri hanya benar jika x.equals(y) menghasilkan nilai benar?

Pertanyaan yang agak aneh. Jika benda A sama dengan benda B, maka benda B sama dengan benda A. Jika B tidak sama dengan benda A, bagaimana mungkin terjadi sebaliknya? Ini adalah logika sederhana. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 11 - 2

100. Apa yang dimaksud dengan tabrakan di HashCode? Bagaimana cara menghadapinya?

Tabrakan kode hash adalah situasi di mana dua objek berbeda memiliki nilai kode hash yang sama . Bagaimana ini mungkin? Faktanya adalah kode hash dipetakan ke tipe Integer , yang pada gilirannya memiliki rentang dari -2147483648 hingga 2147483647, yaitu sekitar 4 miliar bilangan bulat berbeda. Kisaran ini sangat besar, namun bukannya tidak terbatas. Oleh karena itu, situasi mungkin terjadi ketika dua objek yang sangat berbeda memiliki kode hash yang sama. Hal ini sangat kecil kemungkinannya, namun mungkin saja terjadi. Fungsi hash yang diterapkan dengan buruk juga dapat meningkatkan frekuensi kode hash yang identik, yang akan, misalnya, mengembalikan angka dalam kisaran kecil, sehingga meningkatkan kemungkinan tabrakan. Untuk mengatasi tabrakan, Anda perlu menerapkan metode kode hash dengan baik sehingga penyebaran nilai menjadi maksimal dan kemungkinan pengulangan nilai menjadi minimal.

101. Apa yang terjadi jika elemen yang berpartisipasi dalam kontrak HashCode mengubah nilainya?

Jika elemen yang terlibat dalam penghitungan kode hash telah diubah, maka kode hash dari objek itu sendiri akan diubah (jika fungsi hashnya baik). Oleh karena itu, di HashMap disarankan untuk menggunakan objek yang tidak dapat diubah (tidak dapat diubah) sebagai kunci, karena status (bidang) internalnya tidak dapat diubah setelah pembuatan. Oleh karena itu, kode hashnya juga tidak dikonversi setelah pembuatan. Jika Anda menggunakan objek yang bisa diubah sebagai kunci, maka ketika Anda mengubah bidang objek ini, kode hashnya akan berubah dan, sebagai hasilnya, Anda bisa kehilangan pasangan ini di HashMap . Lagi pula, itu akan disimpan di keranjang untuk kode hash asli, dan setelah diubah, akan dicari di keranjang lain. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 11 - 3

102. Tulis metode Equals dan HashCode untuk kelas Student, yang terdiri dari kolom String name dan int age

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;
 }
}
Sama dengan:
  • Pertama kita bandingkan linknya secara langsung, karena jika linknya ke objek yang sama, apa gunanya melanjutkan pengecekan? Bagaimanapun semuanya akan menjadi kenyataan .

  • Memeriksa null dan tipe kelas yang cocok, karena jika suatu objek merupakan argumen null atau tipe lain, ini berarti objek tersebut tidak sama - false .

  • Mentransmisikan objek argumen ke satu tipe (jika itu adalah objek dari tipe induk).

  • Perbandingan bidang kelas primitif (bagaimanapun, perbandingan melalui =! sudah cukup untuk itu ), jika bidangnya tidak sama - false .

  • Memeriksa bidang non-primitif untuk null dan sama dengan (dalam String metode ini diganti dan akan membandingkan dengan benar), jika kedua bidang adalah null atau sama dengan , maka pemeriksaan berakhir dan metode mengembalikan true .

Kode hash:
  • Menetapkan nilai kode hash awal ke age primitif objek .

  • Mengalikan kode hash saat ini dengan 31 (untuk penyebaran yang lebih besar) dan menambahkan kode hash dari bidang string non-primitif (jika bukan nol).

  • Mengembalikan hasilnya.

  • Akibat penggantian kode hash ini, objek dengan nama dan nilai int yang sama akan selalu mengembalikan nilai yang sama.

103. Apa perbedaan antara menggunakan if (obj instanceof Student) dan if (getClass() == obj.getClass())?

Mari kita lihat fungsi masing-masing pendekatan:
  • instanceof memeriksa apakah referensi objek di sisi kiri merupakan turunan dari tipe di sisi kanan atau subtipe darinya.

  • getClass() == ... memeriksa identitas tipe.

Artinya, jika getClass() memeriksa identitas lengkap suatu kelas, maka instanceof akan mengembalikan nilai true meskipun objeknya hanya subtipe, yang dapat memberi kita lebih banyak fleksibilitas saat menggunakan polimorfisme secara aktif. Sebenarnya, kedua pendekatan tersebut bagus jika Anda memahami fitur kerjanya dan menerapkannya di tempat yang tepat.

104. Berikan penjelasan singkat tentang metode clone().

Clone() adalah metode kelas Object , yang tujuannya adalah untuk membuat dan mengembalikan tiruan dari objek saat ini (salinan dari objek saat ini). Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 11 - 4Untuk menggunakannya, Anda perlu mengimplementasikan antarmuka penanda Cloneable :
Student implements Cloneable
Dan ganti metode clone() itu sendiri :
@Override
protected Object clone() throws CloneNotSupportedException {
 return super.clone();
}
Lagi pula, di kelas Object itu dilindungi, yaitu hanya akan terlihat di kelas Student itu sendiri , tetapi tidak terlihat oleh kelas dari luar.

105. Apa kekhasan metode clone() yang bekerja dengan bidang objek bertipe referensi?

Saat mengkloning objek, hanya nilai primitif dan nilai referensi objek yang disalin. Artinya, jika suatu objek memiliki tautan ke objek lain di bidang internalnya, maka hanya tautan ini yang akan dikloning, namun objek lain itu sendiri tidak akan dikloning. Faktanya, inilah yang mereka sebut kloning permukaan. Nah, bagaimana jika Anda memerlukan kloning penuh dengan mengkloning semua objek yang disarangkan? Bagaimana cara memastikan bahwa ini bukan salinan tautan, tetapi klon penuh objek dengan sel memori lain yang terisi di tumpukan? Faktanya, semuanya cukup sederhana - untuk ini Anda juga perlu mengganti metode clone() di setiap kelas objek internal ini dan menambahkan antarmuka penanda - Cloneable . Maka bukan referensi objek yang akan disalin, melainkan objek itu sendiri, karena sekarang mereka juga memiliki kemampuan untuk menyalin dirinya sendiri.

Pengecualian

106. Apa perbedaan antara kesalahan dan pengecualian?

Pengecualian dan kesalahan adalah subkelas dari kelas Throwable . Namun, mereka memiliki perbedaan. Kesalahan tersebut menunjukkan masalah yang terutama terjadi karena sumber daya sistem tidak mencukupi. Dan aplikasi kita seharusnya tidak mendeteksi masalah seperti ini. Beberapa contoh kesalahan adalah sistem crash dan kesalahan kehabisan memori. Kesalahan sebagian besar terjadi saat runtime karena jenisnya tidak dicentang. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 11 - 5Pengecualian adalah masalah yang dapat terjadi saat runtime dan waktu kompilasi. Biasanya ini terjadi pada kode yang ditulis oleh pengembang. Artinya, pengecualian lebih dapat diprediksi dan lebih bergantung pada kami sebagai pengembang. Pada saat yang sama, kesalahan lebih bersifat acak dan tidak bergantung pada kita, melainkan bergantung pada masalah pada sistem itu sendiri di mana aplikasi kita berjalan.

107. Apa perbedaan antara dicentang dan tidak dicentang, pengecualian, lemparan, lemparan.

Seperti yang saya katakan sebelumnya, pengecualian adalah kesalahan selama eksekusi program dan selama kompilasi yang terjadi pada kode yang ditulis oleh pengembang (karena beberapa situasi tidak normal). Dicentang adalah jenis pengecualian yang harus selalu ditangani menggunakan mekanisme coba-tangkap atau dimasukkan ke dalam metode di atas. Throws digunakan dalam header metode untuk menunjukkan kemungkinan pengecualian yang diberikan oleh metode tersebut. Artinya, ini adalah mekanisme untuk “melemparkan” pengecualian ke dalam metode di atas. Tidak dicentang adalah jenis pengecualian yang tidak perlu ditangani dan biasanya kurang dapat diprediksi dan kecil kemungkinannya untuk terjadi. Namun, bisa juga diolah jika diinginkan. Throw digunakan saat melempar pengecualian secara manual, misalnya:
throw new Exception();

108. Apa hierarki pengecualiannya?

Hirarki pengecualian sangat besar dan luas, bahkan terlalu luas untuk diceritakan semuanya di sini. Oleh karena itu, kami hanya akan mempertimbangkan tautan utamanya: Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 11 - 6Di sini, di bagian paling atas hierarki kita melihat kelas - Throwable - kelas umum, nenek moyang dari hierarki pengecualian, yang pada gilirannya dibagi menjadi:
  • Kesalahan - kesalahan kritis yang tidak dapat dicentang.
  • Pengecualian - pengecualian yang dicentang.
Pengecualian dibagi menjadi berbagai pengecualian runtime yang tidak dicentang dan berbagai pengecualian yang dicentang.

109. Apa pengecualian yang dicentang dan tidak dicentang?

Seperti yang saya katakan sebelumnya:
  • Dicentang - pengecualian yang harus Anda tangani, yaitu memprosesnya dalam blok coba - tangkap , atau "meneruskan" ke metode di atas. Untuk melakukan ini, dalam tanda tangan metode, setelah membuat daftar argumen metode, Anda perlu menggunakan kata kunci trows <Exception type> , yang menunjukkan kepada pengguna metode bahwa metode tersebut dapat memunculkan pengecualian ini (seperti peringatan) dan mentransfer tanggung jawab untuk menangani pengecualian bagi pengguna metode ini.

  • Tidak dicentang - pengecualian yang tidak perlu ditangani, karena tidak diperiksa pada waktu kompilasi dan, biasanya, lebih tidak dapat diprediksi. Artinya, perbedaan utama dengan yang dicentang adalah bagi mereka mekanisme coba tangkap atau lempar ini bekerja dengan cara yang sama, tetapi tidak wajib.

101. Tuliskan contoh intersepsi dan penanganan pengecualian dalam blok coba-tangkap suatu metode

try{                                                 // начало блока перехвата
 throw new Exception();                             // ручной бросок исключения
} catch (Exception e) {                              // данное исключение и его потомки будут перехватываться
 System.out.println("Упс, что-то пошло не так =("); // вывод некоторого исключения в консоль
}

102. Tuliskan contoh menangkap dan menangani pengecualian menggunakan pengecualian Anda sendiri

Pertama, mari kita tulis kelas pengecualian kita sendiri, yang mewarisi dari Exception dan menimpa konstruktornya dengan pesan kesalahan:
public class CustomException extends Exception {

 public CustomException(final String message) {
   super(message);
 }
}
Baiklah, selanjutnya kita akan membuangnya secara manual dan mencegatnya seperti pada pertanyaan sebelumnya:
try{
 throw new CustomException("Упс, что-то пошло не так =(");
} catch (CustomException e) {
 System.out.println(e.getMessage());
}
Dan lagi, ketika Anda menjalankannya, Anda akan mendapatkan output berikut ke konsol:
Ups, ada yang tidak beres =(
Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 11 - 7Anda dapat mengetahui lebih lanjut tentang pengecualian di sini . Baiklah, itu saja untuk hari ini! Sampai jumpa di bagian selanjutnya!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION