CodeGym/Java Blog/Acak/Menjelajahi pertanyaan dan jawaban dari wawancara kerja u...
John Squirrels
Level 41
San Francisco

Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java. Bagian 2

Dipublikasikan di grup Acak
anggota
Halo lagi semuanya! Kami terus mencari jawaban atas pertanyaan untuk pengembang Java junior, menengah, dan senior. Pertanyaannya sangat menarik. Saya pribadi suka menganalisisnya, karena membantu saya menemukan kesenjangan dalam pengetahuan teoretis saya, dan terkadang di tempat yang paling tidak terduga. Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  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 tumpang tindih dengan rangkaian artikel ini agar tidak menggandakan informasi yang tidak perlu. Saya sarankan membaca artikel ini karena mencakup pertanyaan wawancara Java Core yang paling umum (populer).
  2. Saya dapat menjelaskan jawabannya secara lebih rinci, tetapi saya tidak akan melakukannya, karena setiap jawaban dapat berlarut-larut di seluruh artikel. Dan tidak ada seorang pun yang akan menanyakan tingkat detail seperti itu kepada Anda dalam wawancara kerja mana pun.
Saya akan meninggalkan tautan untuk studi lebih dalam jika Anda mau. Ayo terbang!

11. Sebutkan semua metode kelas Object

Kelas Object memiliki 11 metode:
  1. Class<?> getClass() — mendapatkan kelas objek saat ini;

  2. int hashCode() — dapatkan kode hash dari objek saat ini;

  3. boolean sama dengan(Object obj) — membandingkan objek saat ini dengan objek lain;

  4. Object clone() — membuat dan mengembalikan salinan objek saat ini;

  5. String toString() — mendapatkan representasi string dari objek;

  6. void notify() — membangunkan satu thread yang menunggu di monitor objek ini (pilihan thread acak);

  7. void notifyAll() — membangunkan semua thread yang menunggu di monitor objek ini;

  8. void wait() — membuat thread saat ini menunggu di monitor saat ini (membekukan thread saat ini) hingga panggilan notify atau notifyAll membangunkan thread (hanya berfungsi di blok yang disinkronkan);

  9. void wait(long timeout) — membuat thread saat ini menunggu di monitor saat ini (pada blok tersinkronisasi saat ini), tetapi dengan batas waktu untuk keluar dari status menunggu (atau sekali lagi, hingga panggilan notify atau notifyAll membangunkan thread);

  10. void wait(long timeout, int nanos) — cara ini sama seperti cara sebelumnya, namun dengan batas waktu yang lebih tepat;

  11. void finalize() — metode ini dipanggil (akhirnya) sebelum objek dipindahkan oleh pengumpul sampah. Ini digunakan untuk membersihkan sumber daya yang diperoleh.

Untuk menggunakan metode hashCode , equal , clone , toString , dan finalize dengan benar, metode tersebut harus diganti sesuai dengan spesifikasi tugas saat ini.

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

Biasanya, saat menggunakan try-catch-finally , blok terakhir digunakan untuk menutup sumber daya. Java 7 memperkenalkan pernyataan coba-dengan-sumber daya yang baru . Hal ini analog dengan try-catch-finally untuk membebaskan sumber daya, namun 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();
}
Nah, itu lebih sederhana, bukan? Selain kode yang lebih sederhana, ada beberapa hal lain yang perlu diperhatikan:
  1. Dalam try-with-resources , sumber daya yang dinyatakan dalam tanda kurung (sumber daya yang akan ditutup) harus mengimplementasikan antarmuka AutoCloseable dan satu-satunya metode close() .

    Metode close dieksekusi secara implisit pada akhirnya blok , jika tidak, bagaimana program mengetahui cara menutup sumber daya?

    Namun Anda mungkin jarang menulis implementasi sumber daya Anda sendiri dan metode penutupannya.

  2. Blok dieksekusi dalam urutan ini:

    1. Blok percobaan .
    2. Yang implisit akhirnya diblokir.
    3. Blok catch , yang menangkap pengecualian yang terjadi pada langkah sebelumnya.
    4. Yang eksplisit akhirnya diblokir.

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

Bayangkan Anda menggunakan try-catch-finally dan Anda mendapatkan pengecualian di blok try . Kemudian blok catch yang ditentukan segera mulai dijalankan, di mana kita telah menulis pengecualian lain (misalnya, dengan pesan yang menjelaskan kesalahan secara lebih rinci), dan Anda ingin metode tersebut melemparkan pengecualian ini ke atas. Kemudian blok akhirnya dieksekusi, dan pengecualian juga dimasukkan ke dalamnya. Namun kali ini berbeda. Manakah dari dua pengecualian berikut yang pada akhirnya akan dilontarkan oleh metode ini? Pengecualian yang diberikan oleh blok akhirnya ! Namun sekarang kita sampai pada poin lain tentang try-with-resources . Mari kita pertimbangkan bagaimana perilaku try-with-resources dalam situasi yang sama. Kita mendapatkan pengecualian di blok try ketika mencoba menutup sumber daya dalam metode close() , yaitu di blok implisit akhirnya . Pengecualian manakah yang akan ditangkap oleh blok catch ? Yang dilempar oleh blok coba ! Pengecualian dari blok implisit akhirnya (dari metode lost() ) akan diabaikan. Pengabaian pengecualian ini juga disebut penindasan pengecualian.

13. Apa yang dimaksud dengan operasi bitwise?

Operasi bitwise adalah operasi pada urutan bit. Ini mencakup operasi logis dan pergeseran bitwise. Operator logika:
  • bitwise AND — Membandingkan nilai bit. Setiap bit yang disetel ke 0 (salah) akan menyetel bit terkait pada hasil menjadi 0. Artinya, jika sebuah bit bernilai 1 (benar) pada kedua nilai yang dibandingkan, maka bit yang dihasilkan juga akan bernilai 1.

    Dilambangkan sebagai DAN atau &

    Contoh: 10111101 & 01100111 = 00100101

  • bitwise OR — Operasi ini kebalikan dari operasi sebelumnya. Setiap bit yang disetel ke 1 akan menyetel bit yang sesuai dalam hasil menjadi 1. Oleh karena itu, jika bit tersebut adalah 0 pada kedua nilai yang dibandingkan, maka bit yang dihasilkan juga akan menjadi 0.

    Dilambangkan sebagai ATAU atau |

    Contoh: 10100101 | 01100011 = 11100111

  • bitwise NOT — Operator ini diterapkan pada satu nilai. Ini membalik (membalikkan) bit-bitnya. Artinya, bit yang tadinya 1 menjadi 0; dan yang tadinya 0 menjadi 1.

    Dilambangkan sebagai TIDAK atau ~

    Contoh: ~10100101 = 01011010

  • bitwise eksklusif OR — Membandingkan nilai bit. Jika kedua bit adalah 1, maka bit yang dihasilkan adalah 0. Jika kedua bit adalah 0, maka bit yang dihasilkan adalah 0. Dengan kata lain, agar bit yang dihasilkan menjadi 1, salah satu bitnya harus 1, dan bit lainnya harus 0.

    Dilambangkan sebagai XOR atau ^

    Contoh: 10100101^01100011 = 11000110

Pergeseran bitwise ( >> dan << ) menggeser bit operan ke arah yang ditentukan, sebanyak jumlah tempat yang ditentukan. Posisi yang dikosongkan diisi dengan angka nol. Misalnya:
  1. 01100011 >> 4 = 00000110
  2. 01100011 << 3 = 00011000
Pengecualiannya adalah ketika Anda menggeser angka negatif ke kanan. Seperti yang Anda ingat, bit pertama dari angka yang ditandatangani menunjukkan tandanya. Jika bit ini 1, maka angkanya negatif. Jika Anda menggeser angka negatif, posisi yang dikosongkan tidak diisi dengan angka nol, melainkan dengan angka satu, karena bit tanda harus dipertahankan. Misalnya: 10100010 >> 2 = 11101000 Artinya, Java memiliki tambahan operator shift kanan unsigned (>>>). Operator ini dianalogikan dengan >>, namun jika digeser, posisi yang kosong akan diisi dengan 0, terlepas dari apakah operannya berupa bilangan negatif atau bilangan positif. Misalnya: 10100010 >>> 2 = 00101000 Baca selengkapnya tentang operasi bitwise di sini . Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 2 - 2Anda dapat menggunakan metode hash() di HashMaps sebagai contoh pergeseran bitwise di Java. Metode ini digunakan untuk menentukan kode hash internal khusus kunci: Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 2 - 3Metode ini memungkinkan Anda mendistribusikan data secara merata dalam HashMap, untuk meminimalkan jumlah tabrakan.

14. Objek standar apa yang tidak dapat diubah yang ada di Java?

Suatu objek tidak dapat diubah jika tidak mengizinkan nilai aslinya berubah. Ini mungkin memiliki metode yang mengembalikan objek baru dengan tipe yang sama dengan nilai berbeda. Beberapa objek standar yang tidak dapat diubah meliputi:
  • tidak diragukan lagi, tipe kekal Java yang paling terkenal adalah String;
  • contoh kelas pembungkus yang membungkus tipe standar: Boolean, Character, Byte, Short, Integer, Long, Double, Float;
  • Objek BigInteger dan BigDecimal, yang biasanya digunakan terutama untuk bilangan BESAR;
  • Objek StackTraceElement yang membentuk jejak tumpukan (misalnya, jejak tumpukan pengecualian);
  • sebuah objek dari kelas File — ia dapat memodifikasi file, tetapi pada saat yang sama objek itu sendiri tetap tidak berubah;
  • UUID, yang sering digunakan untuk mengidentifikasi elemen secara unik;
  • semua objek kelas dalam paket java.time;
  • Objek lokal, yang digunakan untuk mengidentifikasi wilayah geografis, politik, atau budaya.

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

  1. Objek yang tidak dapat diubah aman digunakan dalam lingkungan multithread . Mereka membuatnya agar Anda tidak perlu khawatir kehilangan data karena kondisi balapan. Ini berbeda dibandingkan saat Anda bekerja dengan objek biasa. Dalam hal ini, Anda harus memikirkan dan menemukan mekanisme yang baik saat menggunakan objek dalam lingkungan paralel.

  2. Objek yang tidak dapat diubah dapat digunakan sebagai kunci dalam peta. Jika Anda menggunakan objek yang bisa diubah sebagai kunci HashMap dan kemudian status objek berubah, maka struktur datanya bisa menjadi kacau: objek akan tetap ada, namun jika Anda menggunakan berisiKey(), Anda mungkin tidak menemukannya.

  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. Keuntungan lainnya adalah kegagalan atomisitas. Jika objek yang tidak dapat diubah memunculkan pengecualian, objek tersebut tidak akan dibiarkan dalam keadaan yang tidak diinginkan (rusak).

  5. Kelas-kelas ini mudah untuk diuji.

  6. Anda tidak memerlukan mekanisme tambahan seperti konstruktor salinan atau implementasi kloning objek.

Pertanyaan tentang OOP

16. Apa kelebihan OOP secara umum dan dibandingkan dengan pemrograman prosedural?

Oke, kelebihan OOP:
  1. Aplikasi yang kompleks lebih mudah untuk ditulis menggunakan OOP daripada pemrograman prosedural karena semuanya dipecah menjadi modul-modul kecil — objek yang berinteraksi satu sama lain — dan sebagai hasilnya, pemrograman direduksi menjadi hubungan antar objek.

  2. Aplikasi yang ditulis dengan OOP jauh lebih mudah untuk dimodifikasi (bila prinsip desain dipatuhi dengan benar).

  3. Karena data dan operasi data membentuk satu kesatuan, keduanya tidak tersebar di seluruh aplikasi (yang sering terjadi dalam pemrograman prosedural).

  4. Prinsip enkapsulasi melindungi data paling penting dari pengguna.

  5. Kode yang sama dapat digunakan kembali dengan data yang berbeda karena kelas memungkinkan Anda membuat banyak objek, masing-masing dengan nilainya sendiri.

  6. Warisan dan polimorfisme juga memungkinkan Anda menggunakan kembali dan memperluas kode yang ada (daripada menduplikasi fungsi serupa).

  7. Memperluas aplikasi lebih sederhana dibandingkan dengan pendekatan prosedural.

  8. Pendekatan OOP memungkinkan untuk mengabstraksikan detail implementasi.

17. Beritahu kami apa saja kekurangan yang dimiliki OOP

Sayangnya, mereka juga ada:
  1. OOP membutuhkan banyak pengetahuan teoritis yang harus dikuasai sebelum Anda bisa menulis apapun.

  2. Ide-ide OOP tidak begitu mudah untuk dipahami dan diterapkan dalam praktik (Anda harus berjiwa filsuf).

  3. OOP sedikit mengurangi kinerja program karena meningkatnya kompleksitas sistem.

  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 dibutuhkan untuk analisis awal lebih besar dibandingkan dengan pendekatan prosedural.

18. Apa yang dimaksud dengan polimorfisme statis versus polimorfisme dinamis?

Polimorfisme memungkinkan objek dari kelas atau antarmuka yang sama berperilaku berbeda. Ada dua jenis polimorfisme, yang juga dikenal sebagai pengikatan awal dan pengikatan akhir. Polimorfisme statis, atau pengikatan awal:
  • 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 final;
  • pewarisan tidak terlibat dalam pengikatan awal;
  • polimorfisme statis tidak melibatkan objek tertentu, melainkan informasi tentang tipe kelas yang muncul di sebelah kiri nama variabel.
Polimorfisme dinamis, atau pengikatan terlambat:
  • terjadi saat runtime (saat program sedang berjalan);
  • polimorfisme dinamis menentukan implementasi spesifik mana yang akan dimiliki suatu metode saat runtime;
  • penggantian metode adalah contoh polimorfisme dinamis;
  • pengikatan terlambat berarti menugaskan objek tertentu, referensi tipenya, atau superkelasnya;
  • pewarisan dikaitkan dengan polimorfisme dinamis.

19. Memberikan definisi tentang prinsip abstraksi dalam OOP

Dalam OOP, abstraksi adalah cara untuk mengisolasi sekumpulan karakteristik bermakna dari suatu objek, sekaligus mengecualikan detail yang tidak penting. Artinya, ketika merancang program dengan pendekatan OOP, Anda fokus pada model umum, tanpa membahas detail implementasinya. Di Java, abstraksi diwujudkan melalui antarmuka . Misalnya, Anda memiliki mobil dan itu akan menjadi antarmuka. Dan berbagai interaksi dengannya — misalnya, menghidupkan mesin, memindahkan gigi — adalah fungsi, yang kami gunakan tanpa mempelajari detail penerapannya. Memang benar, saat Anda mengemudi, Anda tidak memikirkan bagaimana tepatnya girboks memenuhi tujuannya, atau bagaimana kunci menghidupkan mesin, atau bagaimana tepatnya roda kemudi memutar roda. Dan jika Anda mengganti implementasi beberapa fungsi (misalnya, mesin), Anda mungkin tidak menyadarinya. Tidak masalah bagi Anda: Anda tidak mempelajari detail penerapannya. Yang penting bagi Anda adalah tindakan tersebut dilakukan. Intinya, ini mengabstraksikan detail implementasi. Pada titik ini, kita akan berhenti hari ini: untuk dilanjutkan!
Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar