JavaRush /Blog Java /Random-MS /Analisis soalan dan jawapan daripada temu bual untuk pemb...

Analisis soalan dan jawapan daripada temu bual untuk pembangun Java. Bahagian 11

Diterbitkan dalam kumpulan
hello! Malah kapal terpantas tanpa laluan hanya akan hanyut di sepanjang ombak. Jika anda membaca artikel saya sekarang, anda pasti mempunyai matlamat. Perkara utama bukanlah untuk sesat, tetapi untuk mengikuti garis anda hingga akhir - untuk menjadi pemaju Java. Hari ini saya ingin meneruskan analisis saya terhadap 250+ soalan untuk pembangun Java, yang akan membantu anda menutup beberapa jurang dalam teori. Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 11 - 1

97. Adakah syarat definisi semula perjanjian dikenakan apabila mentakrifkan semula Equals?

Kaedah equals() yang ditindih mesti mematuhi syarat (peraturan) berikut:
  • reflekstiviti - untuk sebarang nilai x, ungkapan seperti x.equals(x) hendaklah sentiasa mengembalikan true (apabila x != null ).

  • simetri - untuk sebarang nilai x dan y, ungkapan bentuk x.equals(y) mesti kembali benar hanya jika y.equals(x) mengembalikan true .

  • transitivity - untuk sebarang nilai x , y dan z , jika x.equals(y) mengembalikan true dan y.equals(z) juga mengembalikan true , maka x.equals(z) mesti mengembalikan true .

  • ketekalan - untuk sebarang nilai x dan y, panggilan berulang ke x.equals(y) akan sentiasa mengembalikan nilai panggilan sebelumnya kepada kaedah ini, dengan syarat medan yang digunakan untuk membandingkan kedua-dua objek tidak berubah antara panggilan .

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

98. Apakah yang berlaku jika anda tidak mengatasi Equals dan HashCode?

Dalam kes ini, hashCode() akan mengembalikan nombor yang dijana berdasarkan lokasi memori di mana objek yang diberikan disimpan. Iaitu, dua objek dengan medan yang betul-betul sama akan menerima nilai yang berbeza apabila memanggil hashCode() yang tidak ditindih (lagipun, ia disimpan di lokasi memori yang berbeza). The unoverridden equals() membandingkan rujukan untuk melihat sama ada merujuk kepada objek yang sama atau tidak. Iaitu, perbandingan dibuat melalui == , dan dalam kes objek dengan medan yang sama ia akan sentiasa mengembalikan false . Benar hanya akan berlaku apabila membandingkan rujukan kepada objek yang sama. Kadang-kadang ada logik untuk tidak mengatasi kaedah ini. Sebagai contoh, anda mahu semua objek kelas tertentu menjadi unik dan mengatasi kaedah ini hanya akan merosakkan logik keunikan. Perkara utama ialah memahami nuansa kaedah yang ditindih dan tidak ditindih dan menggunakan kedua-dua pendekatan bergantung pada keadaan.

99. Mengapakah simetri hanya benar jika x.equals(y) kembali benar?

Soalan yang agak pelik. Jika objek A adalah sama dengan objek B, maka objek B adalah sama dengan objek A. Jika B tidak sama dengan objek A, maka bagaimanakah kebalikannya mungkin? Ini logik mudah. Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 11 - 2

100. Apakah perlanggaran dalam HashCode? Bagaimana untuk menanganinya?

Perlanggaran Kod hash ialah situasi di mana dua objek berbeza mempunyai nilai Kod cincang yang sama . Bagaimana ini boleh berlaku? Hakikatnya ialah kod cincang dipetakan kepada jenis Integer , yang seterusnya mempunyai julat dari -2147483648 hingga 2147483647, iaitu, kira-kira 4 bilion integer berbeza. Julat ini sangat besar, bagaimanapun, ia tidak terhingga. Oleh itu, situasi mungkin berlaku apabila dua objek yang sama sekali berbeza mempunyai kod cincang yang sama. Ini sangat tidak mungkin, tetapi mungkin. Fungsi cincang yang dilaksanakan dengan buruk juga boleh meningkatkan kekerapan kod cincang yang sama, yang akan, sebagai contoh, mengembalikan nombor dalam julat kecil, yang akan meningkatkan peluang perlanggaran. Untuk memerangi perlanggaran, anda perlu mempunyai pelaksanaan kaedah hashCode yang baik supaya penyebaran nilai adalah maksimum dan peluang untuk mengulangi nilai adalah minimum.

101. Apakah yang berlaku jika elemen yang mengambil bahagian dalam kontrak HashCode menukar nilainya?

Jika elemen yang terlibat dalam pengiraan kod cincang telah diubah, maka kod cincang objek itu sendiri akan ditukar (jika fungsi cincang adalah baik). Oleh itu, dalam HashMap adalah disyorkan untuk menggunakan objek tidak berubah (tidak boleh diubah) sebagai kunci, kerana keadaan dalaman (medan) mereka tidak boleh diubah selepas penciptaan. Sehubungan itu, kod cincang mereka juga tidak ditukar selepas penciptaan. Jika anda menggunakan objek boleh ubah sebagai kunci, maka apabila anda menukar medan objek ini, kod cincangnya akan berubah dan, akibatnya, anda boleh kehilangan pasangan ini dalam HashMap . Lagipun, ia akan disimpan dalam baldi untuk kod cincang asal, dan selepas menukarnya, ia akan dicari dalam baldi lain. Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 11 - 3

102. Tulis kaedah Equals dan HashCode untuk kelas Pelajar, yang terdiri daripada medan nama String dan umur int

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, kami membandingkan pautan secara langsung, kerana jika pautan adalah ke objek yang sama, apa gunanya meneruskan pemeriksaan? Semuanya akan menjadi benar juga .

  • Menyemak nol dan jenis kelas yang sepadan, kerana jika objek ialah hujah null atau jenis lain, ini bermakna objek itu tidak sama - false .

  • Menghantar objek hujah kepada satu jenis (sekiranya ia adalah objek jenis induk).

  • Perbandingan medan kelas primitif (lagipun, perbandingan melalui =! sudah cukup untuknya ), jika medan itu tidak sama - palsu .

  • Menyemak medan bukan primitif untuk null dan equals (dalam String kaedah ditindih dan akan membandingkan dengan betul), jika kedua-dua medan adalah null atau sama , maka semakan akan tamat dan kaedah mengembalikan true .

Kod Hash:
  • Menetapkan nilai kod cincang awal kepada primitif umur objek .

  • Mendarab kod cincang semasa dengan 31 (untuk penyebaran yang lebih besar) dan menambah padanya kod cincang medan rentetan bukan primitif (jika ia bukan nol).

  • Mengembalikan keputusan.

  • Hasil daripada penggantian kod cincang ini, objek dengan nama yang sama dan nilai int akan sentiasa mengembalikan nilai yang sama.

103. Apakah perbezaan antara menggunakan if (obj instanceof Student) dan if (getClass() == obj.getClass())?

Mari lihat apa yang dilakukan oleh setiap pendekatan:
  • instanceof menyemak sama ada rujukan objek di sebelah kiri adalah contoh jenis di sebelah kanan atau beberapa subjenis daripadanya.

  • getClass() == ... menyemak identiti jenis.

Iaitu, jika getClass() menyemak identiti lengkap kelas, maka instanceof akan kembali benar walaupun objek itu hanyalah subjenis, yang boleh memberi kita lebih fleksibiliti apabila menggunakan polimorfisme secara aktif. Sebenarnya, kedua-dua pendekatan adalah baik jika anda memahami ciri kerja mereka dan menerapkannya di tempat yang betul.

104. Berikan penerangan ringkas tentang kaedah klon().

Clone() ialah kaedah kelas Object , tujuannya adalah untuk mencipta dan mengembalikan klon objek semasa (salinan objek semasa). Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 11 - 4Untuk menggunakannya, anda perlu melaksanakan antara muka penanda Boleh Diklon :
Student implements Cloneable
Dan mengatasi kaedah clone() itu sendiri :
@Override
protected Object clone() throws CloneNotSupportedException {
 return super.clone();
}
Lagipun, dalam kelas Objek ia dilindungi, iaitu, ia akan kelihatan hanya dalam kelas Pelajar itu sendiri , tetapi tidak kelihatan kepada kelas dari luar.

105. Apakah keistimewaan kaedah klon() yang berfungsi dengan medan objek jenis rujukan?

Apabila mengklon objek, hanya nilai primitif dan nilai rujukan objek disalin. Ini bermakna jika objek mempunyai pautan ke objek lain dalam medan dalamannya, maka hanya pautan ini akan diklon, tetapi objek lain ini sendiri tidak akan diklon. Sebenarnya, inilah yang mereka panggil pengklonan permukaan. Nah, bagaimana jika anda memerlukan pengklonan sepenuhnya dengan pengklonan semua objek bersarang? Bagaimana untuk memastikan bahawa ini bukan salinan pautan, tetapi klon penuh objek dengan sel memori lain yang diduduki dalam timbunan? Sebenarnya, segala-galanya agak mudah - untuk ini anda juga perlu mengatasi kaedah clone() dalam setiap kelas objek dalaman ini dan menambah antara muka penanda - Cloneable . Kemudian ia tidak akan menjadi rujukan kepada objek yang akan disalin, tetapi objek itu sendiri, kerana kini mereka juga mempunyai keupayaan untuk menyalin diri mereka sendiri.

Pengecualian

106. Apakah perbezaan antara ralat dan pengecualian?

Kedua-dua pengecualian dan ralat adalah subkelas bagi kelas Boleh Lempar . Walau bagaimanapun, mereka mempunyai perbezaan mereka. Ralat menunjukkan masalah yang berlaku terutamanya disebabkan oleh sumber sistem yang tidak mencukupi. Dan aplikasi kami tidak seharusnya mengesan jenis masalah ini. Beberapa contoh ralat adalah ralat sistem dan ralat memori. Ralat kebanyakannya berlaku pada masa jalan kerana ia adalah jenis yang tidak disemak. Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 11 - 5Pengecualian ialah masalah yang boleh berlaku pada masa jalan dan pada masa penyusunan. Biasanya ini berlaku dalam kod yang ditulis oleh pembangun. Iaitu, pengecualian lebih mudah diramal dan lebih bergantung kepada kami sebagai pembangun. Pada masa yang sama, ralat lebih rawak dan lebih bebas daripada kita, tetapi bergantung pada masalah dengan sistem itu sendiri di mana aplikasi kita berjalan.

107. Apakah perbezaan antara ditanda dan tidak ditanda, pengecualian, lontaran, lontaran.

Seperti yang saya katakan sebelum ini, pengecualian adalah ralat semasa pelaksanaan program dan semasa penyusunan yang berlaku dalam kod yang ditulis oleh pembangun (disebabkan oleh beberapa situasi yang tidak normal). Disemak ialah jenis pengecualian yang mesti sentiasa dikendalikan menggunakan mekanisme cuba-tangkap atau dibuang ke dalam kaedah di atas. Balingan digunakan dalam pengepala kaedah untuk menunjukkan kemungkinan pengecualian yang dilemparkan oleh kaedah tersebut. Iaitu, ini adalah mekanisme untuk "membuang" pengecualian ke dalam kaedah di atas. Tidak disemak ialah sejenis pengecualian yang tidak perlu dikendalikan dan biasanya kurang boleh diramal dan kurang berkemungkinan berlaku. Walau bagaimanapun, ia juga boleh diproses jika dikehendaki. Baling digunakan apabila melontar pengecualian secara manual, contohnya:
throw new Exception();

108. Apakah hierarki pengecualian?

Hierarki pengecualian adalah sangat besar dan meluas, malah terlalu luas untuk menceritakan segala-galanya di sini. Oleh itu, kami hanya akan mempertimbangkan pautan utamanya: Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 11 - 6Di sini, di bahagian paling atas hierarki kami melihat kelas - Boleh Dibuang - kelas umum, nenek moyang hierarki pengecualian, yang seterusnya dibahagikan kepada:
  • Ralat - ralat kritikal, tidak boleh disemak.
  • Pengecualian - pengecualian diperiksa.
Pengecualian dibahagikan kepada pelbagai pengecualian masa jalan yang tidak disemak dan pelbagai pengecualian yang disemak.

109. Apakah pengecualian yang ditanda dan tidak ditanda?

Seperti yang saya katakan sebelum ini:
  • Ditandai - pengecualian yang entah bagaimana mesti anda kendalikan, iaitu, sama ada memprosesnya dalam try - catch block , atau "majukan"nya ke kaedah di atas. Untuk melakukan ini, dalam tandatangan kaedah, selepas menyenaraikan argumen kaedah, anda perlu menggunakan kata kunci trows <exception type> , yang menunjukkan kepada pengguna kaedah bahawa kaedah itu boleh membuang pengecualian ini (sesuatu seperti amaran) dan memindahkan tanggungjawab untuk mengendalikan pengecualian kepada pengguna kaedah ini.

  • Tidak disemak - pengecualian yang tidak perlu dikendalikan, kerana ia tidak disemak pada masa penyusunan dan, sebagai peraturan, lebih tidak dapat diramalkan. Iaitu, perbezaan utama dengan checked ialah bagi mereka mekanisme try-catch atau melontar ini berfungsi sama, tetapi ia tidak wajib.

101. Tulis satu contoh memintas dan mengendalikan pengecualian dalam blok cuba-tangkap kaedah

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

102. Tulis contoh menangkap dan mengendalikan pengecualian menggunakan pengecualian anda sendiri

Mula-mula, mari tulis kelas pengecualian kita sendiri, yang mewarisi daripada Pengecualian dan mengatasi pembinanya dengan mesej ralat:
public class CustomException extends Exception {

 public CustomException(final String message) {
   super(message);
 }
}
Nah, kemudian kami akan membuangnya secara manual dan memintasnya seperti dalam soalan sebelumnya:
try{
 throw new CustomException("Упс, что-то пошло не так =(");
} catch (CustomException e) {
 System.out.println(e.getMessage());
}
Dan sekali lagi, apabila anda menjalankannya, anda akan mendapat output berikut ke konsol:
Oops, ada masalah =(
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11 - 7Anda boleh mengetahui lebih lanjut tentang pengecualian di sini . Nah, itu sahaja untuk hari ini! Jumpa anda di bahagian seterusnya!
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION