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 2

Diterbitkan dalam kumpulan
Hello sekali lagi semua! Kami terus mencari jawapan kepada 250+ soalan untuk pembangun Junior, Middle dan Senior. Soalan-soalannya agak menarik, dan saya sendiri suka menganalisisnya: pada saat-saat seperti itu anda boleh menemui jurang dalam pengetahuan teori, dan di tempat yang paling tidak dijangka. Analisis soalan dan jawapan temu bual.  Bahagian 2 - 1Bahagian sebelumnya boleh didapati dalam artikel ini . Tetapi sebelum kita mula, saya ingin mengingatkan anda bahawa:
  1. Saya akan melangkau soalan yang bersilang dengan siri artikel ini supaya tidak menduplikasi maklumat sekali lagi. Saya mengesyorkan membaca bahan-bahan ini, kerana ia mengandungi soalan wawancara Teras Java yang paling biasa (popular).
  2. Soalan mengenai DOU dibentangkan dalam bahasa Ukraine, tetapi saya akan mempunyai segala-galanya di sini dalam bahasa Rusia.
  3. Jawapannya boleh diterangkan dengan lebih terperinci, tetapi saya tidak akan melakukannya, sejak itu jawapan kepada setiap soalan boleh mengambil keseluruhan artikel. Dan mereka tidak akan bertanya kepada anda secara terperinci pada sebarang temu duga.
Jika perlu, saya akan meninggalkan pautan untuk kajian yang lebih mendalam. Jom terbang!

11. Namakan semua kaedah kelas Objek

Kelas Objek mempunyai 11 kaedah:
  • Class<?> getClass() — mendapatkan kelas objek semasa;
  • int hashCode() — mendapatkan kod cincang objek semasa;
  • boolean equals(Object obj) - perbandingan objek semasa dengan yang lain;
  • Klon objek() - mencipta dan memulangkan salinan objek semasa;
  • String toString() — mendapatkan perwakilan rentetan objek;
  • void notify() — membangkitkan satu utas menunggu pada monitor objek ini (pemilihan benang adalah rawak);
  • void notifyAll() - membangkitkan semua benang yang menunggu pada monitor objek ini;
  • void wait() - menukarkan benang semasa kepada mod siap sedia (membekukannya) pada monitor semasa, berfungsi hanya dalam blok yang disegerakkan sehingga sesetengah memberitahu atau memberitahuSemua membangkitkan benang;
  • void wait(long timeout) - juga membekukan benang semasa pada monitor semasa (pada semasa disegerakkan), tetapi dengan pemasa untuk keluar dari keadaan ini (atau sekali lagi: sehingga memberitahu atau memberitahuSemua bangun);
  • void wait(long timeout, int nanos) - kaedah yang serupa dengan yang diterangkan di atas, tetapi dengan pemasa yang lebih tepat untuk keluar dari pembekuan;
  • void finalize() - sebelum memadamkan objek ini, pengumpul sampah memanggil kaedah ini (akhirnya). Ia digunakan untuk membersihkan sumber yang diduduki.
Untuk menggunakan kaedah hashCode , equals​ , clone , toString , dan memuktamadkan dengan betul, kaedah tersebut mesti ditakrifkan semula, dengan mengambil kira tugas dan keadaan semasa.

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

Biasanya, apabila menggunakan try-catch-finally, blok terakhir digunakan untuk menutup sumber. Java 7 memperkenalkan jenis pengendali try-with-resources baharu , analog try-catch-finally untuk membebaskan sumber, tetapi lebih padat dan boleh dibaca. Mari kita ingat rupa try-catch-finally :
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();
}
Ia entah bagaimana menjadi lebih mudah, bukankah anda fikir? Sebagai tambahan kepada penyederhanaan, terdapat beberapa perkara:
  1. Dalam try-with-resources , sumber yang diisytiharkan dalam kurungan (yang akan ditutup) mesti melaksanakan antara muka AutoCloseable dan satu-satunya kaedahnya, close() .

    Kaedah tutup dilaksanakan dalam implisit finally block , jika tidak, bagaimanakah program akan memahami dengan tepat cara menutup sumber yang diberikan?

    Tetapi, kemungkinan besar, anda jarang akan menulis pelaksanaan sumber anda sendiri dan kaedah penutupannya.

  2. Urutan pelaksanaan blok:

    1. cuba blok .
    2. Tersirat akhirnya .
    3. Blok tangkapan yang menangkap pengecualian dalam langkah sebelumnya.
    4. Eksplisit akhirnya .

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

Bayangkan situasi di mana apabila menggunakan cuba-tangkap-akhirnya anda mendapat pengecualian dalam percubaan anda . Sehubungan itu, blok tangkapan tertentu serta-merta mula melaksanakan , di mana anda menulis pengecualian lain (contohnya, dengan mesej yang menerangkan ralat dengan lebih terperinci), dan anda mahu kaedah membuang pengecualian ini lebih jauh. Seterusnya ialah pelaksanaan blok akhirnya , dan pengecualian juga dilemparkan ke dalamnya. Tetapi ini berbeza. Antara dua pengecualian ini, yang manakah kaedah ini akhirnya akan dibuang? Pengecualian dilemparkan oleh blok akhirnya ! Tetapi terdapat juga satu perkara dengan cuba-dengan-sumber . Sekarang mari kita lihat tingkah laku cuba-dengan-sumber dalam situasi yang sama. Kami mendapat pengecualian dalam blok cuba apabila kami cuba menutup sumber dalam kaedah close() , iaitu, dalam implisit finally . Antara pengecualian ini yang manakah akan ditangkap ? Yang dibaling oleh blok try ! Pengecualian daripada kaedah akhirnya tersirat (daripada kaedah close() ) akan diabaikan. Pengabaian ini juga dipanggil penindasan pengecualian.

13. Apakah operasi bitwise?

Operasi bitwise ialah operasi pada rentetan bit yang merangkumi operasi logik dan anjakan bitwise. Operasi logik:
  • bitwise DAN - membandingkan nilai bit, dan dalam proses, mana-mana bit yang ditetapkan kepada 0 (palsu) menetapkan bit yang sepadan dalam hasilnya sebagai 0. Iaitu, jika dalam kedua-dua nilai yang dibandingkan bit adalah 1 (benar), keputusan juga akan menjadi 1.

    Ditandakan sebagai - DAN , &

    Contoh: 10111101 & 01100111 = 00100101

  • bitwise ATAU ialah operasi songsang yang sebelumnya. Mana-mana bit yang ditetapkan kepada 1 menetapkan bit yang serupa dalam keputusan sebagai 1. Dan dengan itu, jika bit itu adalah 0 dalam kedua-dua nilai yang dibandingkan, bit yang terhasil juga akan menjadi 0.

    Ditandakan sebagai - ATAU , |

    Contoh: 10100101 | 01100011 = 11100111

  • bitwise NOT - digunakan pada satu nilai, membalikkan (menyongsangkan) bit. Iaitu, bit yang 1 akan menjadi 0; dan yang 0 akan menjadi 1.

    Ditandakan sebagai - NOT , ~

    Contoh: ~10100101 = 01011010

  • bitwise exclusive ATAU - membandingkan nilai bit, dan jika dalam kedua-dua nilai bit adalah sama dengan 1, maka hasilnya akan menjadi 0, dan jika dalam kedua-dua nilai bit adalah 0, hasilnya akan menjadi 0. Iaitu, untuk hasilnya sama dengan 1, hanya satu daripada bit mesti sama dengan 1, dan yang kedua adalah sama dengan 0.

    Ditandakan sebagai - XOR , ^

    Contoh: 10100101 ^ 01100011 = 11000110

Anjakan bit - >> atau << anjakan bit nilai ke arah yang ditentukan, dengan nombor yang ditentukan. Jawatan kosong diisi dengan sifar. Sebagai contoh:
  1. 01100011 >> 4 = 00000110
  2. 01100011 << 3 = 00011000
Terdapat juga pengecualian apabila mengalihkan nombor negatif ke kanan. Seperti yang anda ingat, bit pertama bertanggungjawab untuk tanda, dan jika bit ini sama dengan 1, maka nombornya adalah negatif. Jika anda mengalihkan nombor negatif, kedudukan yang dikosongkan tidak lagi akan diisi dengan sifar, tetapi dengan satu, kerana bit tanda perlu dikekalkan. Sebagai contoh: 10100010 >> 2 = 11101000 Pada masa yang sama, di Jawa terdapat tambahan operator anjakan kanan yang tidak ditandatangani >>> Operator ini adalah analog daripada >>, apabila beralih, jawatan kosong diisi dengan 0, tidak kira sama ada bilangannya negatif atau positif. Contohnya: 10100010 >>> 2 = 00101000 Baca lebih lanjut mengenai operasi bitwise di sini . Analisis soalan dan jawapan temu bual.  Bahagian 2 - 2Sebagai contoh penggunaan anjakan bitwise dalam Java, anda boleh memetik kaedah hash() HashMap, yang digunakan untuk menentukan kod hash dalaman khas untuk kunci: Analisis soalan dan jawapan temu bual.  Bahagian 2 - 3Kaedah ini membolehkan anda mengagihkan data secara sama rata dalam HashMap untuk meminimumkan bilangan perlanggaran.

14. Apakah kelas tidak berubah standard yang merupakan objek dalam Java?

Tidak boleh ubah ialah objek yang tidak membenarkan parameter asalnya ditukar. Ia mungkin mempunyai kaedah yang mengembalikan objek baharu bagi jenis tertentu, dengan parameter yang anda mahu ubah. Beberapa objek tidak berubah standard:
  • Setakat ini objek tidak berubah yang paling terkenal di Jawa ialah String;
  • contoh kelas pembalut yang membalut jenis standard: Boolean, Character, Byte, Short, Integer, Long, Double, Float;
  • objek yang biasanya digunakan untuk nombor BESAR terutamanya - BigInteger dan BigDecimal;
  • objek yang merupakan unit dalam surih tindanan (contohnya, dalam surih tindanan pengecualian) StackTraceElement;
  • objek kelas Fail - boleh menukar fail, tetapi pada masa yang sama ia sendiri tidak boleh diubah;
  • UUID - yang sering digunakan sebagai id unik untuk elemen;
  • semua objek kelas pakej java.time;
  • Tempatan - digunakan untuk menentukan wilayah geografi, politik atau budaya.

15. Apakah kelebihan objek tidak berubah berbanding objek biasa?

  1. Objek sedemikian selamat apabila digunakan dalam persekitaran berbilang benang . Dengan menggunakannya, anda tidak perlu risau tentang kehilangan data disebabkan keadaan perlumbaan benang. Tidak seperti bekerja dengan objek biasa: dalam kes ini, anda perlu berfikir dengan teliti dan menyusun mekanisme untuk menggunakan objek dalam persekitaran selari.
  2. Objek tidak boleh ubah ialah kunci yang baik dalam peta, kerana jika anda menggunakan objek boleh ubah dan kemudian objek menukar keadaannya, ia boleh menjadi mengelirukan apabila menggunakan HashMap: objek masih akan ada, dan jika anda menggunakan containsKey() ia mungkin tidak dijumpai.
  3. Objek tidak berubah sangat bagus untuk menyimpan data tidak berubah (malar) yang tidak boleh diubah semasa program berjalan.
  4. "Atomicity to failure" - jika objek tidak berubah melemparkan pengecualian, ia masih tidak akan kekal dalam keadaan yang tidak diingini (pecah).
  5. Kelas-kelas ini mudah untuk diuji.
  6. Mekanisme tambahan seperti pembina salinan dan pelaksanaan klon tidak diperlukan.

Soalan tentang OOP

Analisis soalan dan jawapan temu bual.  Bahagian 2 - 4

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

Jadi, kelebihan OOP:
  1. Aplikasi yang kompleks lebih mudah untuk ditulis daripada pengaturcaraan prosedur, kerana semuanya dipecahkan kepada modul kecil - objek yang berinteraksi antara satu sama lain - dan akibatnya, pengaturcaraan turun kepada hubungan antara objek.
  2. Aplikasi yang ditulis menggunakan OOP adalah lebih mudah untuk diubah suai (selagi konsep reka bentuk diikuti).
  3. Memandangkan data dan operasi di atasnya membentuk satu entiti, ia tidak disapu sepanjang aplikasi (yang sering berlaku dengan pengaturcaraan prosedur).
  4. Enkapsulasi maklumat melindungi data paling kritikal daripada pengguna.
  5. Anda boleh menggunakan semula kod yang sama dengan data yang berbeza, kerana kelas membolehkan anda mencipta banyak objek, yang setiap satunya mempunyai nilai atributnya sendiri.
  6. Warisan dan polimorfisme juga membolehkan anda menggunakan semula dan melanjutkan kod sedia ada (bukannya menduplikasi fungsi serupa).
  7. Kebolehlanjutan aplikasi yang lebih mudah berbanding dengan pendekatan prosedur.
  8. Pendekatan OOP memungkinkan untuk abstrak daripada butiran pelaksanaan.

17. Beritahu kami apakah kekurangan yang terdapat dalam OOP

Malangnya, mereka juga hadir:
  1. OOP memerlukan banyak pengetahuan teori yang perlu dikuasai sebelum anda boleh menulis apa-apa.Analisis soalan dan jawapan temu bual.  Bahagian 2 - 5
  2. Idea OOP tidak begitu mudah untuk difahami dan diaplikasikan dalam amalan (anda perlu menjadi seorang ahli falsafah di hati).
  3. Apabila menggunakan OOP, prestasi perisian berkurangan sedikit disebabkan oleh organisasi sistem yang lebih kompleks.
  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 analisis prosedur.

18. Apakah itu polimorfisme statik dan dinamik

Polimorfisme membenarkan objek berkelakuan berbeza untuk kelas atau antara muka yang sama. Terdapat dua jenis polimorfisme, juga dikenali sebagai pengikatan awal dan lewat . Polimorfisme statik, atau pengikatan lebih awal:
  • berlaku pada masa penyusunan (awal kitaran hayat program);
  • memutuskan kaedah mana yang hendak dilaksanakan pada masa penyusunan;
  • Kaedah terlebih beban ialah contoh polimorfisme statik;
  • pengikatan awal termasuk kaedah persendirian, statik dan terminal;
  • pewarisan tidak terlibat dalam pengikatan awal;
  • Polimorfisme statik tidak melibatkan objek tertentu, tetapi maklumat tentang kelas, jenis yang diwakili 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 ialah penetapan objek tertentu, rujukan jenisnya, atau superclassnya;
  • pewarisan dikaitkan dengan polimorfisme dinamik.
Anda boleh membaca lebih lanjut tentang perbezaan antara pengikatan awal dan lewat dalam artikel ini .

19. Takrifkan prinsip pengabstrakan dalam OOP

Abstraksi dalam OOP ialah cara untuk menyerlahkan satu set ciri penting objek, tidak termasuk butiran yang tidak penting. Iaitu, apabila mereka bentuk program dengan pendekatan OOP, anda memberi tumpuan kepada model secara umum, tanpa menyelidiki butiran pelaksanaannya. Di Java, antara muka bertanggungjawab untuk abstraksi . Sebagai contoh, anda mempunyai mesin, dan ini akan menjadi antara muka. Dan pelbagai interaksi dengannya - contohnya, menghidupkan enjin, menggunakan kotak gear - ini adalah fungsi yang kami gunakan tanpa memasukkan butiran pelaksanaan. Lagipun, pada masa ini semasa anda memandu kereta, anda tidak memikirkan bagaimana kotak gear memenuhi tujuannya, atau bagaimana kunci menghidupkan enjin, atau bagaimana stereng memutarkan roda. Dan walaupun pelaksanaan salah satu fungsi ini diganti (contohnya, enjin), anda mungkin tidak menyedarinya. Ini tidak penting kepada anda: anda tidak pergi ke butiran pelaksanaan. Adalah penting bagi anda bahawa tindakan itu dijalankan. Sebenarnya, ini adalah abstrak daripada butiran pelaksanaan. Di sinilah kita akan berhenti hari ini: akan diteruskan!Analisis soalan dan jawapan temu bual.  Bahagian 2 - 6
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION