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

Analisis tanya jawab dari wawancara untuk pengembang Java. Bagian 2

Dipublikasikan di grup Random-ID
Halo lagi semuanya! Kami terus mencari jawaban atas 250+ pertanyaan untuk pengembang Junior, Menengah dan Senior. Pertanyaan-pertanyaannya cukup menarik, dan saya sendiri suka menganalisisnya: pada saat-saat seperti itu Anda dapat menemukan kesenjangan dalam pengetahuan teoretis, dan di tempat-tempat yang paling tidak terduga. Analisis pertanyaan dan jawaban wawancara.  Bagian 2 - 1Bagian sebelumnya dapat ditemukan di artikel ini . Namun sebelum kita mulai, saya ingin mengingatkan Anda bahwa:
  1. Saya akan melewatkan pertanyaan-pertanyaan yang bersinggungan dengan rangkaian artikel ini agar tidak menduplikasi informasi sekali lagi. Saya sarankan membaca materi ini, karena berisi pertanyaan wawancara Java Core yang paling umum (populer).
  2. Pertanyaan tentang DOU disajikan dalam bahasa Ukraina, tetapi saya akan menjawab semuanya di sini dalam bahasa Rusia.
  3. Jawabannya bisa dijelaskan lebih detail, tapi saya tidak akan melakukannya, karena jawaban setiap pertanyaan bisa memakan waktu satu artikel utuh. Dan mereka tidak akan menanyakan Anda secara detail pada wawancara mana pun.
Jika perlu, saya akan meninggalkan link untuk studi lebih dalam. Ayo terbang!

11. Sebutkan semua metode kelas Object

Kelas Object memiliki 11 metode:
  • Class<?> getClass() — mendapatkan kelas dari objek saat ini;
  • int hashCode() — mendapatkan kode hash dari objek saat ini;
  • boolean sama dengan(Obj objek) - perbandingan objek saat ini dengan objek lain;
  • Klon objek() - membuat dan mengembalikan salinan objek saat ini;
  • String toString() — mendapatkan representasi string dari suatu objek;
  • void notify() - membangkitkan satu thread yang menunggu di monitor objek ini (pemilihan thread dilakukan secara acak);
  • void notifyAll() - membangunkan semua thread yang menunggu di monitor objek ini;
  • void wait() - mengalihkan thread saat ini ke mode standby (membekukannya) pada monitor saat ini, hanya berfungsi di blok yang disinkronkan hingga beberapa notify atau notifyAll membangunkan thread;
  • void wait(long timeout) - juga membekukan thread saat ini pada monitor saat ini (pada monitor yang disinkronkan saat ini), tetapi dengan pengatur waktu untuk keluar dari status ini (atau lagi: hingga notify atau notifyAll bangun);
  • void wait(long timeout, int nanos) - metode yang mirip dengan yang dijelaskan di atas, tetapi dengan pengatur waktu yang lebih tepat untuk keluar dari pembekuan;
  • void finalize() - sebelum menghapus objek ini, pengumpul sampah memanggil metode ini (akhirnya). Ini digunakan untuk membersihkan sumber daya yang ditempati.
Untuk menggunakan metode hashCode , equal​ , clone , toString , dan finalize dengan benar, metode tersebut harus didefinisikan ulang, dengan mempertimbangkan tugas dan keadaan saat ini.

12. Apa perbedaan antara coba-dengan-sumber daya dan coba-tangkap-akhirnya ketika berhadapan dengan sumber daya?

Biasanya, saat menggunakan try-catch-finally, blok terakhir digunakan untuk menutup sumber daya. Java 7 memperkenalkan jenis operator baru try-with-resources , analog dari try-catch-finally untuk membebaskan sumber daya, tetapi lebih ringkas dan mudah dibaca. Mari kita ingat seperti apa bentuk 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 ulang kode 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();
}
Ini menjadi lebih mudah, bukan? Selain penyederhanaan, ada beberapa poin:
  1. Dalam try-with-resources , sumber daya yang dideklarasikan dalam tanda kurung (yang akan ditutup) harus mengimplementasikan antarmuka AutoCloseable dan satu-satunya metodenya, close() .

    Metode close dieksekusi secara implisit pada akhirnya blok , jika tidak, bagaimana program akan memahami dengan tepat cara menutup sumber daya tertentu?

    Namun, kemungkinan besar, Anda jarang akan menulis implementasi sumber daya Anda sendiri dan metode penutupannya.

  2. Urutan eksekusi blok:

    1. coba blokir .
    2. Akhirnya tersirat .
    3. Blok tangkapan yang menangkap pengecualian pada langkah sebelumnya.
    4. Akhirnya eksplisit .

    Sebagai aturan, pengecualian yang muncul lebih rendah dalam daftar mengganggu pengecualian yang muncul lebih tinggi.

Bayangkan sebuah situasi di mana ketika menggunakan try-catch-finally pengecualian terjadi di try Anda . Oleh karena itu, blok catch tertentu segera mulai dieksekusi , di mana Anda menulis pengecualian lain (misalnya, dengan pesan yang menjelaskan kesalahan secara lebih rinci), dan Anda ingin metode tersebut melemparkan pengecualian ini lebih lanjut. Berikutnya adalah eksekusi blok akhirnya , dan pengecualian juga dilemparkan ke dalamnya. Tapi ini berbeda. Manakah dari dua pengecualian berikut yang pada akhirnya akan dilontarkan oleh metode ini? Pengecualian diberikan oleh blok akhirnya ! Namun ada juga satu hal dengan try-with-resources . Sekarang mari kita lihat perilaku try-with-resources dalam situasi yang sama. Kami mendapatkan pengecualian di blok try ketika kami mencoba menutup sumber daya dalam metode close() , yaitu, secara implisit pada akhirnya . Pengecualian manakah yang akan ditangkap ? Yang dilempar oleh blok try ! Pengecualian dari implisit akhirnya (dari metode close() ) akan diabaikan. Pengabaian ini juga disebut penekanan pengecualian.

13. Apa yang dimaksud dengan operasi bitwise?

Operasi bitwise adalah operasi pada string bit yang mencakup operasi logis dan pergeseran bitwise. Operasi logis:
  • bitwise AND - membandingkan nilai bit, dan dalam prosesnya, bit apa pun yang disetel ke 0 (salah) menetapkan bit yang sesuai dalam hasil sebagai 0. Artinya, jika dalam kedua nilai yang dibandingkan bitnya adalah 1 (benar), maka hasilnya juga akan menjadi 1.

    Dilambangkan sebagai - DAN , &

    Contoh: 10111101 & 01100111 = 00100101

  • bitwise OR adalah operasi kebalikan dari operasi sebelumnya. Setiap bit yang disetel ke 1 akan menghasilkan bit yang sama dengan 1. Oleh karena itu, jika bit tersebut adalah 0 pada kedua nilai yang dibandingkan, bit yang dihasilkan juga akan menjadi 0.

    Dilambangkan sebagai - ATAU , |

    Contoh: 10100101 | 01100011 = 11100111

  • bitwise NOT - diterapkan pada satu nilai, membalik (membalikkan) bit. Artinya, bit-bit yang tadinya 1 akan menjadi 0; dan yang tadinya 0 akan menjadi 1.

    Dilambangkan sebagai - BUKAN , ~

    Contoh: ~10100101 = 01011010

  • bitwise eksklusif OR - membandingkan nilai bit, dan jika pada kedua nilai bitnya sama dengan 1, maka hasilnya adalah 0, dan jika pada kedua nilai bitnya 0, maka hasilnya adalah 0. Artinya, agar hasilnya sama dengan 1, hanya satu bit yang harus sama dengan 1, dan bit kedua harus sama dengan 0.

    Dilambangkan sebagai - XOR , ^

    Contoh: 10100101^01100011 = 11000110

Pergeseran bitwise - >> atau << menggeser bit suatu nilai ke arah yang ditentukan, dengan angka yang ditentukan. Posisi yang dikosongkan diisi dengan angka nol. Misalnya:
  1. 01100011 >> 4 = 00000110
  2. 01100011 << 3 = 00011000
Ada juga pengecualian ketika menggeser angka negatif ke kanan. Seperti yang Anda ingat, bit pertama bertanggung jawab atas tanda tersebut, dan jika bit ini sama dengan 1, maka angkanya negatif. Jika Anda memindahkan angka negatif, posisi yang dikosongkan tidak lagi diisi dengan nol, tetapi dengan satu, karena bit tanda perlu dipertahankan. Misal: 10100010 >> 2 = 11101000 Pada saat yang sama, di Java ada tambahan operator shift kanan unsigned >>> Operator ini analog dengan >>, ketika shift, posisi yang dikosongkan diisi dengan 0, terlepas dari apakah angkanya negatif atau positif. Misalnya: 10100010 >>> 2 = 00101000 Baca selengkapnya tentang operasi bitwise di sini . Analisis pertanyaan dan jawaban wawancara.  Bagian 2 - 2Sebagai contoh penggunaan pergeseran bitwise di Java, Anda dapat mengutip metode hash() dari HashMap, yang digunakan untuk menentukan kode hash internal khusus untuk sebuah kunci: Analisis pertanyaan dan jawaban wawancara.  Bagian 2 - 3Metode ini memungkinkan Anda mendistribusikan data secara merata di HashMap untuk meminimalkan jumlah tabrakan.

14. Kelas standar apa yang tidak dapat diubah yang merupakan objek di Java?

Immutable adalah objek yang tidak mengizinkan parameter aslinya diubah. Ini mungkin memiliki metode yang mengembalikan objek baru dari tipe tertentu, dengan parameter yang ingin Anda ubah. Beberapa objek standar yang tidak dapat diubah:
  • Sejauh ini objek abadi yang paling terkenal di Java adalah String;
  • contoh kelas pembungkus yang membungkus tipe standar: Boolean, Character, Byte, Short, Integer, Long, Double, Float;
  • objek yang biasanya digunakan terutama untuk bilangan BESAR - BigInteger dan BigDecimal;
  • objek yang merupakan unit dalam stacktrace (misalnya, dalam pengecualian stacktrace) StackTraceElement;
  • objek dari kelas File - dapat mengubah file, tetapi pada saat yang sama file itu sendiri tidak dapat diubah;
  • UUID - yang sering digunakan sebagai id unik untuk elemen;
  • semua objek kelas dari paket java.time;
  • Lokal - digunakan untuk menentukan wilayah geografis, politik, atau budaya.

15. Apa kelebihan benda yang tidak dapat diubah dibandingkan benda biasa?

  1. Objek seperti itu aman bila digunakan dalam lingkungan multi-thread . Dengan menggunakannya, Anda tidak perlu khawatir kehilangan data karena kondisi thread race. Berbeda dengan bekerja dengan objek biasa: dalam hal ini, Anda harus berpikir dengan sangat hati-hati dan menyusun mekanisme untuk menggunakan objek dalam lingkungan paralel.
  2. Objek yang tidak dapat diubah adalah kunci yang baik dalam peta, karena jika Anda menggunakan objek yang dapat diubah dan kemudian objek tersebut mengubah statusnya, hal ini dapat membingungkan saat menggunakan HashMap: objek tersebut akan tetap ada, dan jika Anda menggunakan berisiKey() mungkin tidak ada ditemukan.
  3. Objek yang tidak dapat diubah sangat bagus untuk menyimpan data yang tidak dapat diubah (konstan) yang tidak boleh diubah saat program sedang berjalan.
  4. “Atomisitas menuju kegagalan” - jika objek yang tidak dapat diubah memunculkan pengecualian, objek tersebut tetap tidak akan berada dalam kondisi (rusak) yang tidak diinginkan.
  5. Kelas-kelas ini mudah untuk diuji.
  6. Mekanisme tambahan seperti copy konstruktor dan implementasi kloning tidak diperlukan.

Pertanyaan tentang OOP

Analisis pertanyaan dan jawaban wawancara.  Bagian 2 - 4

16. Apa kelebihan OOP secara umum dibandingkan pemrograman prosedural?

Jadi, kelebihan OOP:
  1. Aplikasi yang kompleks lebih mudah untuk ditulis daripada pemrograman prosedural, karena semuanya dipecah menjadi modul-modul kecil - objek yang berinteraksi satu sama lain - dan sebagai hasilnya, pemrograman bermuara pada hubungan antar objek.
  2. Aplikasi yang ditulis menggunakan OOP jauh lebih mudah untuk dimodifikasi (asalkan konsep desainnya diikuti).
  3. Karena data dan operasi di dalamnya merupakan satu kesatuan, mereka tidak tersebar ke seluruh aplikasi (yang sering terjadi dengan pemrograman prosedural).
  4. Enkapsulasi informasi melindungi data paling penting dari pengguna.
  5. Dimungkinkan untuk menggunakan kembali kode yang sama dengan data yang berbeda, karena kelas memungkinkan Anda membuat banyak objek, yang masing-masing memiliki nilai atributnya sendiri.
  6. Warisan dan polimorfisme juga memungkinkan Anda menggunakan kembali dan memperluas kode yang ada (daripada menduplikasi fungsi serupa).
  7. Ekstensibilitas aplikasi lebih mudah dibandingkan dengan pendekatan prosedural.
  8. Pendekatan OOP memungkinkan untuk mengabstraksikan detail implementasi.

17. Beritahu kami apa saja kekurangan yang ada pada OOP

Sayangnya, mereka juga hadir:
  1. OOP membutuhkan banyak pengetahuan teoritis yang perlu dikuasai sebelum Anda dapat menulis apapun.Analisis pertanyaan dan jawaban wawancara.  Bagian 2 - 5
  2. Ide-ide OOP tidak begitu mudah untuk dipahami dan diterapkan dalam praktik (Anda harus berjiwa filsuf).
  3. Saat menggunakan OOP, kinerja perangkat lunak sedikit berkurang karena organisasi sistem yang lebih kompleks.
  4. Pendekatan OOP memerlukan lebih banyak memori, karena semuanya terdiri dari kelas, antarmuka, metode, yang memakan lebih banyak memori daripada variabel biasa.
  5. Waktu yang diperlukan untuk analisis awal lebih besar dibandingkan analisis prosedural.

18. Apa yang dimaksud dengan polimorfisme statis dan dinamis

Polimorfisme memungkinkan objek berperilaku berbeda untuk kelas atau antarmuka yang sama. Ada dua jenis polimorfisme, yang juga dikenal sebagai pengikatan awal dan pengikatan akhir . Polimorfisme statis, atau pengikatan sebelumnya:
  • terjadi pada waktu kompilasi (di awal siklus hidup program);
  • memutuskan metode mana yang akan dieksekusi pada waktu kompilasi;
  • Metode kelebihan beban adalah contoh polimorfisme statis;
  • pengikatan awal mencakup metode privat, statis, dan terminal;
  • pewarisan tidak terlibat dalam pengikatan awal;
  • Polimorfisme statis tidak melibatkan objek tertentu, tetapi informasi tentang kelas, yang tipenya direpresentasikan di sebelah kiri nama variabel.
Polimorfisme dinamis, atau pengikatan terlambat:
  • terjadi saat runtime (saat program sedang berjalan);
  • polimorfisme dinamis menentukan implementasi spesifik apa yang akan dimiliki suatu metode pada saat runtime;
  • penggantian metode adalah contoh polimorfisme dinamis;
  • pengikatan akhir adalah penetapan objek tertentu, referensi tipenya, atau superkelasnya;
  • pewarisan dikaitkan dengan polimorfisme dinamis.
Anda dapat membaca lebih lanjut tentang perbedaan antara pengikatan awal dan pengikatan akhir di artikel ini .

19. Mendefinisikan prinsip abstraksi dalam OOP

Abstraksi dalam OOP adalah cara untuk menyorot sekumpulan karakteristik penting dari suatu objek, tidak termasuk detail yang tidak penting. Artinya, ketika merancang program dengan pendekatan OOP, Anda fokus pada model secara umum, tanpa mendalami detail implementasinya. Di Java, antarmuka bertanggung jawab atas abstraksi . Misalnya, Anda memiliki mesin, dan ini akan menjadi antarmukanya. Dan berbagai interaksi dengannya - misalnya, menghidupkan mesin, menggunakan girboks - ini adalah fungsi yang kami gunakan tanpa membahas detail implementasi. Lagi pula, saat Anda sedang mengendarai mobil, Anda tidak memikirkan bagaimana tepatnya girboks memenuhi tujuannya, atau bagaimana kunci menghidupkan mesin, atau bagaimana tepatnya roda kemudi memutar roda. Dan bahkan jika penerapan salah satu fungsi ini diganti (misalnya, mesin), Anda mungkin tidak menyadarinya. Ini tidak masalah bagi Anda: Anda tidak menjelaskan secara detail penerapannya. Penting bagi Anda agar tindakan tersebut dilakukan. Sebenarnya, ini adalah abstraksi dari detail implementasi. Di sinilah kita akan berhenti hari ini: untuk dilanjutkan!Analisis pertanyaan dan jawaban wawancara.  Bagian 2 - 6
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION