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 2

Diterbitkan dalam kumpulan
Hello sekali lagi, semua orang! Kami terus mencari jawapan kepada soalan untuk pembangun Java junior, pertengahan dan kanan. Soalannya sangat menarik. Saya secara peribadi suka menganalisisnya, kerana ia membantu saya mencari jurang dalam pengetahuan teori saya, dan di tempat yang paling tidak dijangka kadangkala. Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 2 - 1Bahagian sebelumnya boleh didapati dalam artikel ini . Tetapi sebelum kita mula, saya ingin mengingatkan anda bahawa:
  1. Saya akan melangkau soalan yang bertindih dengan siri artikel ini untuk tidak menduplikasi maklumat yang tidak perlu. Saya mengesyorkan membaca artikel ini kerana ia merangkumi soalan wawancara Teras Java yang paling biasa (popular).
  2. Saya boleh menerangkan jawapan dengan lebih terperinci, tetapi saya tidak akan, kerana setiap jawapan boleh berlarutan untuk keseluruhan artikel. Dan tiada siapa yang akan meminta anda untuk tahap perincian itu dalam mana-mana temu duga kerja.
Saya akan meninggalkan pautan untuk kajian yang lebih mendalam jika anda mahu. Jom terbang!

11. Namakan semua kaedah kelas Objek

Kelas Objek mempunyai 11 kaedah:
  1. Class<?> getClass() — dapatkan kelas objek semasa;

  2. int hashCode() — dapatkan kod cincang objek semasa;

  3. boolean equals(Object obj) — bandingkan objek semasa dengan objek lain;

  4. Klon objek () — mencipta dan mengembalikan salinan objek semasa;

  5. String toString() — dapatkan perwakilan rentetan objek;

  6. void notify() — bangunkan satu utas menunggu pada monitor objek ini (pilihan benang adalah rawak);

  7. void notifyAll() — bangunkan semua benang menunggu pada monitor objek ini;

  8. void wait() — buat benang semasa menunggu pada monitor semasa (membekukan benang semasa) sehingga panggilan notify atau notifyAll membangunkan benang (hanya berfungsi dalam blok yang disegerakkan);

  9. void wait(long timeout) — buat benang semasa menunggu pada monitor semasa (pada blok disegerakkan semasa), tetapi dengan tamat masa untuk keluar dari keadaan menunggu (atau sekali lagi, sehingga panggilan notify atau notifyAll membangkitkan thread);

  10. void wait(long timeout, int nanos) — kaedah ini seperti kaedah sebelumnya, tetapi dengan tamat masa yang lebih tepat;

  11. void finalize() — kaedah ini dipanggil (akhirnya) sebelum objek dialih keluar oleh pemungut sampah. Ia digunakan untuk membersihkan sumber yang diperoleh.

Untuk menggunakan hashCode , equals , clone , toString , dan memuktamadkan kaedah dengan betul, kaedah tersebut mesti ditindih mengikut spesifikasi tugas semasa.

12. Apakah perbezaan antara cuba-dengan-sumber dan cuba-tangkap-akhirnya apabila bekerja dengan sumber?

Biasanya, apabila menggunakan try-catch-finally , blok terakhir digunakan untuk menutup sumber. Java 7 memperkenalkan pernyataan cuba-dengan-sumber baharu . Ia adalah analog untuk mencuba-tangkap-akhirnya untuk membebaskan sumber, tetapi lebih padat dan boleh dibaca. Mari kita ingat bagaimana rupa cuba-tangkap-akhirnya :

String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
   bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
   bufferedWriter.write(text); 
} catch (IOException e) {
   e.printStackTrace();
} finally {
   try {
       bufferedWriter.close();
   } catch (IOException e) {
       e.printStackTrace();
   }
}
Sekarang mari kita tulis semula kod ini, tetapi menggunakan try-with-resources :

String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
   bufferedWriter.write(text);
} catch (IOException e) {
   e.printStackTrace();
}
Sekarang itu entah bagaimana lebih mudah, bukankah anda fikir? Sebagai tambahan kepada kod yang lebih mudah, terdapat beberapa perkara lain yang perlu diberi perhatian:
  1. Dalam try-with-resources , sumber yang diisytiharkan dalam kurungan (sumber yang akan ditutup) mesti melaksanakan antara muka AutoCloseable dan kaedah close() tunggalnya .

    Kaedah tutup dilaksanakan dalam implisit finally block , jika tidak, bagaimanakah program dapat mengetahui dengan tepat cara menutup sumber?

    Tetapi anda mungkin jarang menulis pelaksanaan sumber anda sendiri dan kaedah penutupannya.

  2. Blok dilaksanakan dalam susunan ini:

    1. Blok percubaan .
    2. Yang tersirat akhirnya menyekat.
    3. Blok tangkapan , yang menangkap pengecualian yang berlaku dalam langkah sebelumnya.
    4. Eksplisit akhirnya menyekat.

    Sebagai peraturan, pengecualian yang dilemparkan lebih rendah dalam senarai mengganggu pengecualian yang dilemparkan lebih tinggi.

Bayangkan anda menggunakan try-catch-finally dan anda mendapat pengecualian dalam blok try . Kemudian blok tangkapan yang ditentukan serta-merta mula dilaksanakan, di mana kami telah menulis pengecualian lain (contohnya, dengan mesej yang menerangkan ralat dengan lebih terperinci), dan anda mahu kaedah melontarkan pengecualian ini ke atas. Kemudian blok akhirnya dilaksanakan, dan pengecualian dilemparkan ke dalamnya juga. Tetapi kali ini berbeza. Antara dua pengecualian ini, yang manakah kaedah ini akhirnya akan dibuang? Pengecualian yang dilemparkan oleh blok akhirnya ! Tetapi kini kita telah sampai ke satu titik lagi tentang cuba-dengan-sumber . Mari kita pertimbangkan cara cuba-dengan-sumber berkelakuan dalam situasi yang sama. Kami mendapat pengecualian dalam blok cuba apabila cuba menutup sumber dalam kaedah close() , iaitu dalam blok akhirnya tersirat . Manakah antara pengecualian ini yang akan ditangkap oleh blok tangkapan ? Yang dibaling oleh blok try ! Pengecualian daripada blok akhirnya tersirat (daripada kaedah lose() ) akan diabaikan. Pengabaian pengecualian ini juga dipanggil penindasan pengecualian.

13. Apakah operasi bitwise?

Operasi bitwise ialah operasi pada jujukan bit. Ia termasuk operasi logik dan anjakan bitwise. Operator logik:
  • bitwise AND — Membandingkan nilai bit. Mana-mana bit yang ditetapkan kepada 0 (palsu) menetapkan bit yang sepadan dalam keputusan kepada 0. Iaitu, jika bit adalah 1 (benar) dalam kedua-dua nilai yang dibandingkan, maka bit yang terhasil juga akan menjadi 1.

    Ditandakan sebagai DAN atau &

    Contoh: 10111101 & 01100111 = 00100101

  • bitwise ATAU — Operasi ini adalah bertentangan dengan operasi sebelumnya. Mana-mana bit yang ditetapkan kepada 1 menetapkan bit yang sepadan dalam keputusan kepada 1. Oleh itu, jika bit adalah 0 dalam kedua-dua nilai yang dibandingkan, maka bit yang terhasil juga akan menjadi 0.

    Ditandakan sebagai ATAU atau |

    Contoh: 10100101 | 01100011 = 11100111

  • bitwise NOT — Operator ini digunakan pada satu nilai. Ia membalikkan (menyongsangkan) bit. Iaitu, bit yang 1 menjadi 0; dan yang 0 menjadi 1.

    Ditandakan sebagai TIDAK atau ~

    Contoh: ~10100101 = 01011010

  • bitwise exclusive ATAU — Membandingkan nilai bit. Jika kedua-dua bit adalah 1, maka bit yang terhasil ialah 0. Jika kedua-dua bit adalah 0, maka bit yang terhasil ialah 0. Dengan kata lain, agar bit yang terhasil menjadi 1, hanya satu bit mestilah 1, dan bit yang lain mestilah 0.

    Ditandakan sebagai XOR atau ^

    Contoh: 10100101 ^ 01100011 = 11000110

Anjakan bitwise ( >> dan << ) anjakan bit operan ke arah yang ditentukan, mengikut bilangan tempat yang ditentukan. Jawatan kosong diisi dengan sifar. Sebagai contoh:
  1. 01100011 >> 4 = 00000110
  2. 01100011 << 3 = 00011000
Pengecualian adalah apabila anda mengalihkan nombor negatif ke kanan. Seperti yang anda ingat, bit pertama nombor yang ditandatangani menunjukkan tanda itu. Jika bit ini adalah 1, maka nombornya adalah negatif. Jika anda mengalihkan nombor negatif, kedudukan yang dikosongkan tidak diisi dengan sifar, sebaliknya dengan satu, kerana bit tanda mesti dikekalkan. Contohnya: 10100010 >> 2 = 11101000 Yang mengatakan, Java mempunyai operator anjakan kanan tambahan yang tidak ditandatangani (>>>). Operator ini serupa dengan >>, tetapi apabila dialihkan, kedudukan kosong diisi dengan 0, tidak kira sama ada operan itu adalah nombor negatif atau nombor positif. Contohnya: 10100010 >>> 2 = 00101000 Baca lebih lanjut mengenai operasi bitwise di sini . Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 2 - 2Anda boleh mengambil kaedah hash() dalam HashMaps sebagai contoh anjakan bitwise dalam Java. Kaedah ini digunakan untuk menentukan kod cincang dalaman khas kunci: Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 2 - 3Kaedah ini membolehkan anda mengagihkan data dalam HashMap secara sama rata, untuk meminimumkan bilangan perlanggaran.

14. Apakah objek tidak berubah standard yang terdapat di Jawa?

Objek tidak boleh berubah jika ia tidak membenarkan nilai asalnya berubah. Ia mungkin mempunyai kaedah yang mengembalikan objek baharu daripada jenis yang sama dengan nilai yang berbeza. Beberapa objek tidak berubah standard termasuk:
  • tidak dinafikan, jenis tidak berubah Java yang paling terkenal ialah String;
  • contoh kelas pembalut yang membalut jenis standard: Boolean, Character, Byte, Short, Integer, Long, Double, Float;
  • Objek BigInteger dan BigDecimal, yang biasanya digunakan untuk nombor BIG terutamanya;
  • Objek StackTraceElement yang membentuk surih tindanan (contohnya, surih tindanan pengecualian);
  • objek kelas Fail — ia boleh mengubah suai fail, tetapi pada masa yang sama objek itu sendiri kekal tidak berubah;
  • UUID, yang sering digunakan untuk mengenal pasti elemen secara unik;
  • semua objek kelas dalam pakej java.time;
  • Objek setempat, yang digunakan untuk mengenal pasti wilayah geografi, politik atau budaya.

15. Apakah kelebihan objek tidak berubah berbanding objek biasa?

  1. Objek tidak boleh ubah selamat digunakan dalam persekitaran berbilang benang . Mereka membuatnya supaya anda tidak perlu risau tentang kehilangan data akibat keadaan perlumbaan. Ini berbeza daripada semasa anda bekerja dengan objek biasa. Dalam kes itu, anda perlu berfikir dan menghasilkan mekanisme yang baik apabila menggunakan objek dalam persekitaran selari.

  2. Objek tidak berubah adalah baik sebagai kunci dalam peta. Jika anda menggunakan objek boleh ubah sebagai kunci HashMap dan kemudian keadaan objek berubah, maka struktur data boleh menjadi keliru: objek masih akan ada, tetapi jika anda menggunakan containsKey(), anda mungkin tidak menemuinya.

  3. Objek tidak berubah sangat bagus untuk menyimpan data tidak berubah (malar) yang tidak boleh diubah semasa program berjalan.

  4. Kelebihan lain ialah atomicity kegagalan. Jika objek tidak berubah melemparkan pengecualian, ia tidak akan dibiarkan dalam keadaan yang tidak diingini (pecah).

  5. Kelas-kelas ini mudah untuk diuji.

  6. Anda tidak memerlukan sebarang mekanisme tambahan seperti pembina salinan atau pelaksanaan pengklonan objek.

Soalan tentang OOP

16. Apakah kelebihan OOP secara umum dan berbanding dengan pengaturcaraan prosedur?

Baiklah, kelebihan OOP:
  1. Aplikasi kompleks lebih mudah untuk ditulis menggunakan OOP daripada pengaturcaraan prosedur kerana semuanya dipecahkan kepada modul kecil — objek yang berinteraksi antara satu sama lain — dan akibatnya, pengaturcaraan dikurangkan kepada hubungan antara objek.

  2. Aplikasi yang ditulis dengan OOP adalah lebih mudah untuk diubah suai (apabila prinsip reka bentuk diperhatikan dengan betul).

  3. Memandangkan kedua-dua data dan operasi data membentuk satu entiti, ia tidak disapu di seluruh aplikasi (yang selalunya berlaku dalam pengaturcaraan prosedur).

  4. Prinsip enkapsulasi melindungi data paling kritikal daripada pengguna.

  5. Kod yang sama boleh digunakan semula dengan data yang berbeza kerana kelas membolehkan anda membuat banyak objek, setiap satu dengan nilainya sendiri.

  6. Warisan dan polimorfisme juga membenarkan anda menggunakan semula dan melanjutkan kod sedia ada (bukannya menduplikasi fungsi serupa).

  7. Memanjangkan aplikasi adalah lebih mudah daripada dengan pendekatan prosedur.

  8. Pendekatan OOP memungkinkan untuk mengabstrak butiran pelaksanaan.

17. Beritahu kami apakah kelemahan OOP

Malangnya, mereka juga wujud:
  1. OOP memerlukan banyak pengetahuan teori yang mesti dikuasai sebelum anda boleh menulis apa-apa.

  2. Idea OOP tidak begitu mudah untuk difahami dan diaplikasikan dalam amalan (anda perlu menjadi ahli falsafah sedikit).

  3. OOP mengurangkan prestasi program sedikit disebabkan oleh peningkatan kerumitan sistem.

  4. Pendekatan OOP memerlukan lebih banyak memori kerana semuanya terdiri daripada kelas, antara muka, kaedah, yang mengambil lebih banyak memori daripada pembolehubah biasa.

  5. Masa yang diperlukan untuk analisis awal adalah lebih besar daripada pendekatan prosedur.

18. Apakah polimorfisme statik berbanding polimorfisme dinamik?

Polimorfisme membenarkan objek daripada kelas atau antara muka yang sama berkelakuan berbeza. Terdapat dua jenis polimorfisme, yang juga dikenali sebagai pengikatan awal dan lewat. Polimorfisme statik, atau pengikatan awal:
  • berlaku pada masa penyusunan (awal kitaran hayat program);
  • memutuskan kaedah mana yang hendak dilaksanakan pada masa penyusunan;
  • kelebihan beban kaedah ialah contoh polimorfisme statik;
  • pengikatan awal termasuk kaedah persendirian, statik dan akhir;
  • pewarisan tidak terlibat dalam pengikatan awal;
  • polimorfisme statik tidak melibatkan objek tertentu, sebaliknya maklumat tentang jenis kelas yang muncul di sebelah kiri nama pembolehubah.
Polimorfisme dinamik, atau pengikatan lewat:
  • berlaku semasa runtime (semasa program sedang berjalan);
  • polimorfisme dinamik menentukan pelaksanaan khusus kaedah yang akan ada pada masa jalan;
  • kaedah mengatasi adalah contoh polimorfisme dinamik;
  • pengikatan lewat bermaksud memberikan objek tertentu, rujukan jenisnya, atau superclassnya;
  • pewarisan dikaitkan dengan polimorfisme dinamik.

19. Berikan definisi prinsip abstraksi dalam OOP

Dalam OOP, abstraksi ialah satu cara untuk mengasingkan satu set ciri bermakna objek, sambil mengecualikan butiran yang tidak penting. Iaitu, apabila mereka bentuk program dengan pendekatan OOP, anda memberi tumpuan kepada model umum, tanpa pergi ke butiran pelaksanaannya. Di Java, abstraksi direalisasikan melalui antara muka . Sebagai contoh, anda mempunyai kereta dan itu akan menjadi antara muka. Dan pelbagai interaksi dengannya — contohnya, menghidupkan enjin, menukar gear — adalah fungsi, yang kami gunakan tanpa menyelidiki butiran pelaksanaan. Sesungguhnya, semasa anda memandu, anda tidak memikirkan dengan tepat bagaimana kotak gear memenuhi tujuannya, atau cara kunci menghidupkan enjin, atau bagaimana tepatnya stereng memusingkan roda. Dan jika anda menggantikan pelaksanaan beberapa fungsi (contohnya, enjin), anda mungkin tidak menyedarinya. Ia tidak penting kepada anda: anda tidak menyelidiki butiran pelaksanaan. Apa yang penting bagi anda ialah tindakan itu dijalankan. Pada dasarnya, ini mengabstraksi butiran pelaksanaan. Pada ketika ini, kita akan berhenti hari ini: akan diteruskan!
Komen
  • Popular
  • Baru
  • Tua
Anda mesti log masuk untuk meninggalkan ulasan
Halaman ini tidak mempunyai sebarang ulasan lagi