JavaRush /Java Blog /Random-ID /Inti Java. Pertanyaan untuk wawancara, bagian 3
Vadim625
Level 27

Inti Java. Pertanyaan untuk wawancara, bagian 3

Dipublikasikan di grup Random-ID
Pada dua artikel sebelumnya, kami telah membahas beberapa pertanyaan penting yang paling sering ditanyakan kepada Anda dalam wawancara. Saatnya untuk melanjutkan dan melihat pertanyaan lainnya.
Inti Java.  Pertanyaan wawancara, bagian 3 - 1

Penyalinan dalam dan penyalinan dangkal

Salinan persis dari aslinya adalah tiruannya. Di Java, ini berarti bisa membuat objek dengan struktur yang mirip dengan objek aslinya. Metode ini clone()menyediakan fungsionalitas ini. Penyalinan dangkal menyalin informasi sesedikit mungkin. Secara default, kloning di Java bersifat dangkal, mis. Object classtidak tahu tentang struktur kelas yang disalinnya. Saat mengkloning, JVM melakukan hal berikut:
  1. Jika suatu kelas hanya memiliki anggota bertipe primitif, maka salinan objek yang sepenuhnya baru akan dibuat dan referensi ke objek tersebut akan dikembalikan.
  2. Jika suatu kelas tidak hanya berisi anggota tipe primitif, tetapi juga anggota tipe kelas lainnya, maka referensi ke objek kelas ini akan disalin. Oleh karena itu, kedua objek akan memiliki referensi yang sama.
Penyalinan mendalam menduplikasi segalanya. Penyalinan mendalam adalah dua koleksi, salah satunya menduplikasi semua elemen koleksi asli. Kami ingin membuat salinan sedemikian rupa sehingga perubahan pada elemen apa pun dari salinan tersebut tidak akan memengaruhi koleksi aslinya. Kloning mendalam memerlukan aturan berikut:
  1. Tidak perlu menyalin data primitif secara terpisah;
  2. Semua kelas anggota di kelas asli harus mendukung kloning. Untuk setiap anggota kelas, itu harus dipanggil super.clone()ketika metodenya diganti clone();
  3. Jika ada anggota kelas yang tidak mendukung kloning, maka dalam metode clone, Anda perlu membuat instance baru dari kelas tersebut dan menyalin setiap anggotanya dengan semua atribut ke objek kelas baru, satu per satu.
Cari tahu lebih lanjut tentang kloning di sini

Apa itu sinkronisasi? Penguncian tingkat objek dan penguncian tingkat kelas?

Sinkronisasi mengacu pada multithreading. Blok kode yang disinkronkan hanya dapat dieksekusi oleh satu thread dalam satu waktu. Java memungkinkan Anda memproses banyak thread secara bersamaan. Hal ini dapat mengakibatkan dua atau lebih thread ingin mengakses bidang yang sama. Sinkronisasi membantu menghindari kesalahan memori yang terjadi ketika sumber daya memori digunakan secara tidak benar. Ketika suatu metode dideklarasikan sebagai tersinkronisasi, thread menahan monitornya. Jika thread lain mencoba mengakses metode tersinkronisasi saat ini, thread tersebut diblokir dan menunggu monitor menjadi bebas. Sinkronisasi di Java dilakukan dengan kata kunci tersinkronisasi khusus . Anda dapat menandai setiap blok atau metode di kelas Anda dengan cara ini. Kata kunci tersinkronisasi tidak dapat digunakan bersama dengan variabel atau atribut kelas. Penguncian tingkat objek adalah mekanisme ketika Anda ingin menyinkronkan metode non-statis atau blok kode non-statis sehingga hanya satu thread yang dapat mengeksekusi blok kode pada instance kelas tertentu. Ini harus selalu dilakukan untuk membuat thread instance kelas aman. Penguncian tingkat kelas mencegah beberapa thread memasuki blok tersinkronisasi untuk semua instance kelas yang tersedia. Misalnya, jika ada 100 instance kelas DemoClass, maka hanya 1 thread yang dapat mengeksekusi demoMethod() menggunakan salah satu variabel pada waktu tertentu. Hal ini harus selalu dilakukan untuk memastikan keamanan benang statis. Pelajari lebih lanjut tentang sinkronisasi di sini.

Apa perbedaan antara tidur() dan tunggu()?

Sleep()adalah metode yang digunakan untuk menunda proses selama beberapa detik. Dalam kasus wait(), thread berada dalam status menunggu hingga kita memanggil metode notify()or notifyAll(). Perbedaan utamanya adalah wait()ia melepaskan kunci monitor sementara sleep()tidak melepaskan kuncinya. Wait()digunakan untuk aplikasi multi-thread, sleep()digunakan hanya untuk menghentikan sementara eksekusi thread. Thread.sleep()menempatkan thread saat ini dalam status "Tidak Dapat Dijalankan" selama jangka waktu tertentu. Utas menyimpan status monitor sebelum metode ini dipanggil. Jika thread lain memanggil t.interrupt(), thread yang “tertidur” akan aktif. Perhatikan bahwa ini sleep()adalah metode statis, artinya metode ini selalu memengaruhi thread saat ini (yang menjalankan metode tersebut sleep()). Kesalahan umum adalah memanggil t.sleep()di mana tthread lainnya; bahkan ketika thread saat ini yang memanggil metode tersebut sleep()bukanlah tthread. Object.wait()mengirimkan thread saat ini ke status "Tidak Dapat Dijalankan" untuk sementara, sama seperti sleep(), tetapi dengan beberapa nuansa. Wait()memanggil suatu objek, bukan thread; kami menyebut objek ini "objek kunci". Sebelum memanggil lock.wait(), thread saat ini harus disinkronkan dengan "objek kunci"; wait()setelah itu, ia melepaskan kunci ini, dan menambahkan thread ke “daftar tunggu” yang terkait dengan kunci ini. Nantinya, thread lain dapat melakukan sinkronisasi dengan objek kunci yang sama dan memanggil lock.notify(). Cara ini akan "membangunkan" thread asli yang masih menunggu. Pada prinsipnya wait()/ notify()dapat dibandingkan dengan sleep()/ interrupt(), hanya saja thread aktif tidak memerlukan penunjuk langsung ke thread tidur, hanya perlu mengetahui objek kunci bersama. Baca perbedaan detailnya di sini.

Apakah mungkin untuk menetapkan null ke variabel referensi ini?

Tidak Anda tidak bisa. Di Java, sisi kiri operator penugasan harus berupa variabel. "Ini" adalah kata kunci khusus yang selalu memberikan instance kelas terkini. Ini bukan sembarang variabel. Demikian pula, null tidak dapat ditetapkan ke variabel menggunakan kata kunci “super” atau kata kunci serupa lainnya.

Apa perbedaan antara && dan &?

&- bitwise dan &&- secara logis.
  1. &mengevaluasi kedua sisi operasi;
  2. &&mengevaluasi sisi kiri operasi. Jika benar, pihaknya terus mengevaluasi sisi kanan.
Lihat di sini untuk pemahaman lebih dalam.

Bagaimana cara mengganti metode sama dengan() dan hachCode()?

hashCode()dan equals()metode didefinisikan di kelas Object, yang merupakan kelas induk untuk objek Java. Karena alasan ini, semua objek Java mewarisi implementasi default untuk metode. Metode ini hashCode()digunakan untuk mendapatkan bilangan bulat unik untuk objek tertentu. Bilangan bulat ini digunakan untuk menentukan lokasi suatu objek pada saat objek tersebut perlu disimpan, misalnya ke HashTable. Secara default, hashCode()mengembalikan integerrepresentasi alamat lokasi memori tempat objek disimpan. Metode ini equls(), seperti namanya, digunakan untuk sekadar menguji apakah dua objek sama. Implementasi default memeriksa referensi objek untuk melihat apakah keduanya sama. Di bawah ini adalah pedoman penting untuk memuat ulang metode ini:
  1. Selalu gunakan atribut objek yang sama saat membuat hashCode()dan equals();
  2. Simetri. Itu. xjika ia mengembalikan nilai true untuk beberapa objek y x.equals(y), maka ia y.equals(x)harus mengembalikan nilai true;
  3. Refleksivitas. Untuk objek apa pun x x.equals(x)harus mengembalikan nilai true;
  4. Konsistensi. Untuk objek apa pun xdan y x.equals(y)mengembalikan hal yang sama jika informasi yang digunakan dalam perbandingan tidak berubah;
  5. Transitivitas. Untuk objek apa pun x, ydan z, jika x.equals(y)ia mengembalikan nilai benar dan y.equals(z)mengembalikan nilai benar, maka ia x.equals(z)harus mengembalikan nilai benar;
  6. Setiap kali suatu metode dipanggil pada objek yang sama selama eksekusi aplikasi, metode tersebut harus mengembalikan nomor yang sama kecuali informasi yang digunakan berubah. hashCodedapat mengembalikan nilai berbeda untuk objek identik dalam contoh aplikasi berbeda;
  7. Jika dua objek sama, menurut equals, maka keduanya hashCodeharus mengembalikan nilai yang sama;
  8. Persyaratan sebaliknya adalah opsional. Dua objek yang tidak sama dapat mengembalikan kode hash yang sama. Namun, untuk meningkatkan kinerja, lebih baik objek yang berbeda mengembalikan kode yang berbeda.
Baca fakta menarik mengenai metode tersebut di sini.

Beritahu kami tentang pengubah akses

Kelas, bidang, konstruktor, dan metode Java dapat memiliki salah satu dari empat pengubah akses yang berbeda: private Jika suatu metode atau variabel ditandai private , maka hanya kode dalam kelas yang sama yang dapat mengakses variabel tersebut, atau memanggil metode tersebut. Kode di dalam subkelas tidak dapat mengakses variabel atau metode, juga tidak dapat mengaksesnya dari kelas lain. Pengubah akses pribadi paling sering digunakan untuk konstruktor, metode, dan variabel. default Pengubah akses default dideklarasikan jika pengubah tidak ditentukan sama sekali. Pengubah ini berarti bahwa akses ke bidang, konstruktor, dan metode kelas tertentu dapat diperoleh dengan kode di dalam kelas itu sendiri, kode di dalam kelas dalam paket yang sama. Subkelas tidak dapat mengakses metode dan variabel anggota superkelas jika dideklarasikan sebagai default , kecuali subkelas tersebut berada dalam paket yang sama dengan superkelas. protected Pengubah protected berfungsi sama seperti default , kecuali subkelas juga dapat mengakses metode dan variabel superkelas yang dilindungi. Pernyataan ini benar meskipun subkelasnya tidak berada dalam paket yang sama dengan superkelasnya. public Pengubah akses publik berarti bahwa semua kode dapat mengakses kelas, variabelnya, konstruktor, atau metodenya, di mana pun kode tersebut berada. Inti Java.  Pertanyaan untuk wawancara, bagian 3 - 2

Apa itu pemulung? Bisakah kita meneleponnya?

Pengumpulan sampah adalah fitur manajemen memori otomatis di banyak bahasa pemrograman modern, seperti Java dan bahasa di NET.Framework. Bahasa yang menggunakan pengumpulan sampah sering mengartikan pengumpulan sampah di mesin virtual seperti JVM. Pengumpulan sampah memiliki dua tujuan: memori yang tidak terpakai harus dikosongkan, dan memori tidak boleh dikosongkan jika program masih menggunakannya. Bisakah Anda menjalankan pengumpulan sampah secara manual? Tidak, System.gc()ini memberi Anda akses sebanyak mungkin. Pilihan terbaik adalah memanggil metode ini System.gc(), yang akan memberi petunjuk kepada pengumpul sampah bahwa metode tersebut perlu dijalankan. Tidak ada cara untuk segera menjalankannya karena pengumpul sampah bersifat non-deterministik. Selain itu, menurut dokumentasi, OutOfMemoryErrorini tidak akan diteruskan jika mesin virtual gagal mengosongkan memori setelah pengumpulan sampah penuh. Pelajari lebih lanjut tentang pemulung di sini.

Apa arti kata kunci asli? Jelaskan secara rinci

Kata kunci asli digunakan untuk menunjukkan bahwa metode tersebut diterapkan dalam bahasa pemrograman selain file Java. Metode asli telah digunakan di masa lalu. Dalam versi Java saat ini, hal ini lebih jarang diperlukan. Saat ini, metode asli diperlukan ketika:
  1. Anda harus memanggil perpustakaan dari Java yang ditulis dalam bahasa lain.
  2. Anda memerlukan akses ke sumber daya sistem atau perangkat keras yang hanya dapat diakses menggunakan bahasa lain (biasanya C). Faktanya, banyak fungsi sistem yang berinteraksi dengan komputer sebenarnya (seperti disk atau data jaringan) hanya dapat dipanggil dengan metode asli.
Kerugian menggunakan pustaka metode asli juga signifikan:
  1. JNI/JNA dapat mengganggu kestabilan JVM, terutama jika Anda mencoba melakukan sesuatu yang rumit. Jika metode asli Anda melakukan kesalahan, ada kemungkinan JVM mogok. Selain itu, hal buruk dapat terjadi jika metode asli Anda dipanggil dari beberapa thread. Dan seterusnya.
  2. Lebih sulit untuk men-debug program dengan kode asli .
  3. Kode asli memerlukan konstruksi kerangka kerja terpisah, yang dapat menimbulkan masalah saat porting ke platform lain.

Apa itu serialisasi?

Dalam ilmu komputer, dalam konteks penyimpanan dan transmisi data, serialisasi adalah proses menerjemahkan struktur data atau keadaan suatu objek ke dalam format yang dapat disimpan dan kemudian diambil di lingkungan komputasi lain. Setelah menerima serangkaian bit, bit tersebut dihitung ulang sesuai dengan format serialisasi, dan dapat digunakan untuk membuat tiruan yang identik secara semantik dari objek aslinya. Java menyediakan serialisasi otomatis, yang memerlukan objek untuk mengimplementasikan antarmuka java.io.Serializable. Implementasi antarmuka menandai kelas sebagai "dapat diserialkan". Antarmuka java.io.Serializable tidak memiliki metode serialisasi, tetapi kelas serializable dapat secara opsional menentukan metode yang akan dipanggil sebagai bagian dari proses serialisasi/diserialisasi. Saat membuat perubahan pada kelas, Anda perlu mempertimbangkan kelas mana yang kompatibel dan tidak dengan serialisasi. Anda dapat membaca instruksi lengkapnya di sini. Saya akan memberikan poin terpenting: Perubahan yang tidak kompatibel:
  1. Hapus bidang;
  2. Memindahkan kelas ke atas atau ke bawah dalam hierarki;
  3. Mengubah bidang non-statis menjadi statis atau non-sementara menjadi sementara;
  4. Mengubah tipe data primitif yang dideklarasikan;
  5. Mengubah metode WriteObjectsehingga ReadObjecttidak lagi menulis atau membaca kolom secara default;
  6. Pindah kelas Serializableke Externalizableatau sebaliknya;
  7. Mengubah kelas enum menjadi non-enum atau sebaliknya;
  8. Menghapus Serializableatau Externalizable;
  9. Menambahkan writeReplacemetode readResolveke kelas.
Perubahan yang kompatibel:
  1. Menambahkan bidang;
  2. Menambah/menghapus kelas;
  3. Menambahkan metode WriteObject/ReadObject[metode defaultReadObjectatau defaultWriteObjectharus dipanggil di awal];
  4. Menghapus metode WriteObject/ReadObject;
  5. Tambahan java.io.Serializable;
  6. Mengubah akses lapangan;
  7. Mengubah bidang statis menjadi non-statis atau sementara menjadi non-transien .
Tautan ke bagian sebelumnya: Java Core. Pertanyaan wawancara, bagian 1 Java Core. Pertanyaan wawancara, bagian 2 Artikel asli Selamat belajar!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION