CodeGym /Blog Java /rawak /Meneroka soalan dan jawapan daripada temu duga kerja untu...
John Squirrels
Tahap
San Francisco

Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java. Bahagian 11

Diterbitkan dalam kumpulan
Hai! Malah kapal terpantas hanya akan hanyut di atas ombak jika ia tidak mempunyai laluan. Jika anda membaca artikel ini sekarang, anda pasti mempunyai matlamat. Perkara utama adalah tidak keluar dari kursus dan sebaliknya pergi sepenuhnya untuk menjadi pembangun Java. Hari ini saya ingin meneruskan ulasan saya tentang soalan untuk pembangun Java untuk membantu mengisi beberapa jurang anda dalam teori. Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 11 - 1

97. Adakah sebarang peraturan terpakai apabila mengatasi equals()?

Apabila mengatasi kaedah equals(), anda mesti mematuhi peraturan berikut:
  • reflekstiviti — untuk sebarang nilai x , x.equals(x) mesti sentiasa mengembalikan true (di mana x != null ).

  • simetri — untuk sebarang nilai x dan y , x.equals(y) mesti mengembalikan true 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 kali x.equals(y) akan sentiasa mengembalikan nilai yang sama selagi medan yang digunakan untuk membandingkan dua objek tidak berubah antara setiap panggilan.

  • perbandingan null — untuk sebarang nilai x , memanggil x.equals(null) mesti mengembalikan false .

98. Apakah yang berlaku jika anda tidak mengatasi equals() dan hashCode()?

Dalam kes ini, hashCode() akan mengembalikan nombor yang dijana berdasarkan alamat sel memori tempat objek disimpan. Dalam erti kata lain, apabila kaedah hashCode() asal dipanggil pada dua objek dengan medan yang sama, hasilnya akan berbeza (kerana ia disimpan di lokasi memori yang berbeza). Kaedah equals() asal membandingkan rujukan, iaitu ia menunjukkan sama ada rujukan menghala ke objek yang sama. Dalam erti kata lain, perbandingan menggunakan operator == , dan ia akan sentiasa mengembalikan palsu untuk objek yang berbeza, walaupun apabila medan mereka adalah sama. true dikembalikan hanya apabila membandingkan rujukan kepada objek yang sama. Kadang-kadang masuk akal untuk tidak mengatasi kaedah ini. Sebagai contoh, anda mahu semua objek kelas tertentu menjadi unik — mengatasi kaedah ini hanya boleh merosakkan jaminan sedia ada kod cincang unik. Perkara penting ialah memahami nuansa kaedah ini, sama ada ditindih atau tidak, dan menggunakan pendekatan mana yang diperlukan oleh keadaan.

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

Soalan ini 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 bagaimana kebalikannya boleh berlaku? Ini adalah akal sehat.

100. Apakah perlanggaran HashCode? Bagaimana anda menghadapinya?

Perlanggaran HashCode berlaku apabila dua objek berbeza mempunyai HashCode yang sama . Bagaimana mungkin? Nah, kod cincang akan dipetakan kepada Integer, yang mempunyai julat dari -2147483648 hingga 2147483647. Iaitu, ia boleh menjadi salah satu daripada kira-kira 4 bilion integer berbeza. Julat ini besar tetapi tidak terbatas. Ini bermakna terdapat situasi apabila dua objek yang sama sekali berbeza mungkin mempunyai kod cincang yang sama. Ia sangat tidak mungkin, tetapi ia mungkin. Fungsi cincang yang dilaksanakan dengan baik boleh menjadikan kod cincang yang sama lebih kerap dengan mengembalikan nombor dalam julat yang kecil, sekali gus meningkatkan peluang perlanggaran. Untuk mengurangkan perlanggaran, anda perlu mempunyai pelaksanaan yang baik bagi kaedah HashCode yang menyebarkan nilai secara seragam dan meminimumkan peluang nilai berulang.

101. Apakah yang berlaku jika nilai elemen yang menyertai kontrak hashCode berubah?

Jika elemen yang terlibat dalam pengiraan kod cincang berubah, maka kod cincang objek harus berubah (jika fungsi cincang adalah baik). Itulah sebabnya anda harus menggunakan objek tidak boleh ubah sebagai kunci dalam HashMap , kerana keadaan dalaman (medan) tidak boleh diubah selepas penciptaan. Dan berikutan bahawa kod cincang mereka berubah selepas penciptaan. Jika anda menggunakan objek boleh ubah sebagai kunci, maka apabila medan objek berubah, kod cincangnya akan berubah dan anda boleh kehilangan pasangan nilai kunci yang sepadan dalam HashMap . Lagipun, ia akan disimpan dalam baldi yang dikaitkan dengan kod cincang asal, tetapi selepas objek berubah, anda akan mencarinya dalam baldi yang berbeza.

102. Tulis kaedah equals() dan hashCode() untuk kelas Pelajar yang mempunyai nama String dan medan 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():
  • Mula-mula, kita membandingkan rujukan secara langsung, kerana jika rujukan menghala pada objek yang sama, apakah gunanya untuk terus menyemak kesaksamaan? Kita sudah tahu bahawa hasilnya akan menjadi benar .

  • Kami menyemak untuk null dan sama ada jenis kelas adalah sama kerana jika parameter adalah null atau jenis lain, maka objek tidak boleh sama, dan hasilnya mestilah false .

  • Kami menghantar parameter kepada jenis yang sama (lagipun, bagaimana jika ia adalah objek jenis induk).

  • Kami membandingkan medan primitif (perbandingan menggunakan =! akan mencukupi). Jika mereka tidak sama, kami membalas palsu .

  • Kami menyemak medan bukan primitif untuk melihat sama ada ia adalah batal dan menggunakan kaedah sama ( kelas String mengatasi kaedah, jadi ia akan melakukan perbandingan dengan betul). Jika kedua-dua medan adalah batal, atau sama dengan mengembalikan benar , kami berhenti menyemak dan kaedah mengembalikan benar .

hashCode() :
  • Kami menetapkan nilai awal kod cincang sama dengan nilai medan umur objek .

  • Kami mendarab kod cincang semasa dengan 31 (untuk sebaran nilai yang lebih besar) dan kemudian menambah kod cincang medan Rentetan bukan primitif (jika ia bukan nol).

  • Kami pulangkan hasilnya.

  • Mengatasi kaedah dengan cara ini bermakna objek dengan nama dan nilai int yang sama akan sentiasa mengembalikan kod cincang yang sama.

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

Mari kita lihat apa yang dilakukan oleh setiap ungkapan:
  • instanceof menyemak sama ada rujukan objek di sebelah kiri adalah contoh jenis di sebelah kanan atau salah satu subjenisnya.

  • "getClass() == ..." menyemak sama ada jenis adalah sama.

Dalam erti kata lain, getClass() mengembalikan identiti khusus kelas, tetapi instanceof mengembalikan benar walaupun objek itu hanyalah subjenis, yang boleh memberi kita lebih fleksibiliti apabila menggunakan polimorfisme. Kedua-dua pendekatan ini menjanjikan jika anda memahami dengan tepat cara ia berfungsi dan menerapkannya di tempat yang betul.

104. Berikan penerangan ringkas tentang kaedah klon().

Kaedah klon () tergolong dalam kelas Objek . Tujuannya adalah untuk mencipta dan mengembalikan klon (salinan) objek semasa. Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 11 - 2Untuk menggunakan kaedah ini, anda perlu melaksanakan antara muka penanda Boleh Diklon :

Student implements Cloneable
Dan mengatasi kaedah klon() itu sendiri:

@Override
protected Object clone() throws CloneNotSupportedException {
 return super.clone();
}
Lagipun, ia dilindungi dalam kelas Objek , iaitu ia hanya akan kelihatan dalam kelas Pelajar dan tidak kelihatan kepada kelas luaran.

105. Apakah pertimbangan khas yang perlu anda ingat mengenai kaedah klon() dan pembolehubah rujukan dalam objek?

Apabila objek diklon, hanya nilai primitif dan nilai rujukan objek disalin. Ini bermakna jika objek mempunyai medan yang merujuk objek lain, maka hanya rujukan akan diklon — objek rujukan lain ini tidak akan diklon. Inilah yang dipanggil salinan cetek. Jadi, bagaimana jika anda memerlukan salinan lengkap, di mana setiap objek bersarang diklon? Bagaimanakah anda memastikan bahawa ini bukan salinan rujukan semata-mata, sebaliknya salinan lengkap objek berbeza yang menduduki alamat memori yang berbeza dalam timbunan? Sebenarnya, semuanya agak mudah — untuk setiap kelas yang dirujuk secara dalaman, anda perlu mengatasi kaedah klon() dan menambah antara muka penanda Boleh Diklon . Sebaik sahaja anda melakukan ini, operasi klon tidak akan menyalin rujukan kepada objek sedia ada, sebaliknya akan menyalin objek yang dirujuk, kerana kini mereka juga mempunyai keupayaan untuk menyalin sendiri.

Pengecualian

106. Apakah perbezaan antara ralat dan pengecualian?

Pengecualian, serta ralat, adalah subkelas Throwable . Walau bagaimanapun, mereka mempunyai perbezaan mereka. Ralat menunjukkan masalah yang berlaku terutamanya disebabkan oleh kekurangan sumber sistem. Dan aplikasi kami tidak sepatutnya melihat jenis masalah ini. Contoh ralat ini termasuk ralat sistem dan ralat kehabisan memori. Ralat kebanyakannya berlaku pada masa jalan, kerana ia tidak ditandai. Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 11 - 3Pengecualian ialah masalah yang boleh berlaku pada masa jalan dan pada masa penyusunan. Masalah ini biasanya timbul dalam kod yang kami tulis sebagai pembangun. Ini bermakna bahawa pengecualian ini lebih boleh diramal dan lebih bergantung kepada kami. Sebaliknya, kesilapan lebih rawak dan lebih bebas daripada kita. Sebaliknya, mereka bergantung pada masalah dalam sistem yang aplikasi kami sedang berjalan.

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

Seperti yang saya katakan sebelum ini, pengecualian ialah ralat runtime atau compile-time yang berlaku dalam kod yang ditulis oleh pembangun (disebabkan oleh beberapa situasi yang tidak normal). Disemak ialah apa yang kami panggil pengecualian yang kaedah mesti sentiasa kendalikan dengan menggunakan mekanisme cuba-tangkap atau masukkan semula kepada kaedah panggilan. Kata kunci lontaran digunakan dalam pengepala kaedah untuk menunjukkan pengecualian yang mungkin dilontarkan oleh kaedah tersebut . Dalam erti kata lain, ia memberikan kita mekanisme untuk membuang pengecualian kepada kaedah panggilan. Pengecualian yang tidak ditandai tidak perlu dikendalikan. Mereka cenderung kurang dapat diramalkan dan kurang berkemungkinan. Yang berkata, anda boleh mengendalikannya jika anda mahu. Kami menggunakan lontaran apabila melontar pengecualian secara manual, sebagai contoh:

throw new Exception();

108. Apakah hierarki pengecualian?

Hierarki pengecualian adalah sangat luas. Terlalu banyak untuk dihuraikan dengan secukupnya di sini. Jadi, sebaliknya kita hanya akan mempertimbangkan cabang utamanya: Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 11 - 4 Di sini, di bahagian paling atas hierarki, kita melihat kelas Boleh Lempar , yang merupakan nenek moyang umum hierarki pengecualian dan seterusnya dibahagikan kepada:
  • Ralat — masalah kritikal dan tidak disekat.
  • Pengecualian — pengecualian yang boleh disemak.
Pengecualian dibahagikan kepada pelbagai pengecualian masa jalan yang tidak disemak dan pelbagai pengecualian yang disemak.

109. Apakah pengecualian yang disemak dan tidak disemak?

Seperti yang saya katakan sebelum ini:
  • Pengecualian yang disemak ialah pengecualian yang anda mesti kendalikan. Iaitu, anda mesti mengendalikannya dalam blok cuba-tangkap atau membuangnya ke kaedah di atas. Untuk melakukan ini, selepas menyenaraikan argumen kaedah dalam tandatangan kaedah, gunakan lontaran <jenis pengecualian> untuk menunjukkan bahawa kaedah boleh membuang pengecualian itu. Ini agak seperti amaran, meletakkan kaedah panggilan pada notis bahawa ia mesti bertanggungjawab untuk mengendalikan pengecualian itu.

  • Pengecualian yang tidak disemak tidak perlu dikendalikan, kerana ia tidak disemak pada masa penyusunan dan biasanya lebih tidak dapat diramalkan. Perbezaan utama mereka dengan pengecualian yang diperiksa ialah pengendaliannya dengan menggunakan blok tangkap cuba atau dengan melontar semula adalah pilihan dan bukannya wajib.

101. Tulis satu contoh di mana anda menggunakan blok cuba-tangkap untuk menangkap dan mengendalikan pengecualian.


try{                                                 // Start of the try-catch block
 throw new Exception();                             // Manually throw an exception
} catch (Exception e) {                              // Exceptions of this type and its subtypes will be caught
 System.out.println("Oops! Something went wrong =("); // Display the exception
}

102. Tulis contoh di mana anda menangkap dan mengendalikan pengecualian tersuai anda sendiri.

Mula-mula, mari tulis kelas pengecualian kita sendiri yang mewarisi Pengecualian dan mengatasi pembinanya yang mengambil mesej ralat sebagai hujah:

public class CustomException extends Exception {
 
 public CustomException(final String message) {
   super(message);
 }
}
Seterusnya kami akan secara manual membuang satu dan menangkapnya seperti yang kami lakukan dalam contoh untuk soalan sebelumnya:

try{
 throw new CustomException("Oops! Something went wrong =(");
} catch (CustomException e) {
 System.out.println(e.getMessage());
}
Sekali lagi, apabila kami menjalankan kod kami, kami mendapat output berikut:
Aduh! Ada yang tidak kena =(
Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 11 - 5Nah, itu sahaja untuk hari ini! Jumpa anda di bahagian seterusnya!
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION