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

Analisis tanya jawab dari wawancara untuk pengembang Java. Bagian 7

Dipublikasikan di grup Random-ID
Hai semuanya! Pemrograman penuh dengan jebakan. Dan praktis tidak ada topik di mana Anda tidak akan tersandung dan terbentur. Hal ini terutama berlaku untuk pemula. Satu-satunya cara untuk menguranginya adalah dengan belajar. Secara khusus, ini berlaku untuk analisis terperinci mengenai topik-topik paling mendasar. Hari ini saya terus menganalisis 250+ pertanyaan dari wawancara pengembang Java, yang mencakup topik dasar dengan baik. Saya ingin mencatat bahwa daftar tersebut juga berisi beberapa pertanyaan non-standar yang memungkinkan Anda melihat topik umum dari sudut yang berbeda.Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 7 - 1

62. Apa yang dimaksud dengan kumpulan string dan mengapa diperlukan?

Di memori di Java (Heap, yang akan kita bicarakan nanti) ada area - String pool , atau string pool. Ini dirancang untuk menyimpan nilai string. Dengan kata lain, ketika Anda membuat string tertentu, misalnya melalui tanda kutip ganda:
String str = "Hello world";
pemeriksaan dilakukan untuk melihat apakah kumpulan string memiliki nilai yang diberikan. Jika demikian, variabel str diberi referensi ke nilai tersebut di kumpulan. Jika tidak, nilai baru akan dibuat di kumpulan, dan referensi ke nilai tersebut akan ditetapkan ke variabel str . Mari kita lihat sebuah contoh:
String firstStr = "Hello world";
String secondStr = "Hello world";
System.out.println(firstStr == secondStr);
benar akan ditampilkan di layar . Kita ingat bahwa == membandingkan referensi—artinya kedua referensi ini merujuk pada nilai yang sama dari kumpulan string. Hal ini dilakukan agar tidak menghasilkan banyak objek identik bertipe String di memori, karena seperti yang kita ingat, String adalah kelas yang tidak dapat diubah, dan jika kita memiliki banyak referensi ke nilai yang sama, tidak ada salahnya. Sekarang tidak mungkin situasi di mana mengubah nilai di satu tempat akan mengubah beberapa tautan lain sekaligus. Namun demikian, jika kita membuat string menggunakan new :
String str = new String("Hello world");
objek terpisah akan dibuat di memori yang akan menyimpan nilai string ini (dan tidak masalah apakah kita sudah memiliki nilai tersebut di kumpulan string). Sebagai konfirmasi:
String firstStr = new String("Hello world");
String secondStr = "Hello world";
String thirdStr = new String("Hello world");
System.out.println(firstStr == secondStr);
System.out.println(firstStr == thirdStr);
Kami akan mendapatkan dua nilai palsu , yang berarti kami memiliki tiga nilai berbeda di sini yang direferensikan. Sebenarnya, inilah mengapa disarankan untuk membuat string hanya dengan menggunakan tanda kutip ganda. Namun, Anda dapat menambahkan (atau mendapatkan referensi ke) nilai ke dalam kumpulan string saat membuat objek menggunakan new . Untuk melakukan ini, kami menggunakan metode kelas string - magang() . Metode ini secara paksa membuat nilai di kumpulan string, atau mendapatkan tautan ke sana jika sudah disimpan di sana. Berikut ini contohnya:
String firstStr = new String("Hello world").intern();
String secondStr = "Hello world";
String thirdStr = new String("Hello world").intern();
System.out.println(firstStr == secondStr);
System.out.println(firstStr == thirdStr);
System.out.println(secondStr == thirdStr);
Hasilnya, kita akan mendapatkan tiga nilai sebenarnya di konsol , yang berarti ketiga variabel merujuk ke string yang sama.Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 7 - 2

63. Pola GOF apa yang digunakan di kumpulan string?

Pola GOF terlihat jelas pada string pool - flyweight , atau disebut pemukim. Jika Anda melihat template lain di sini, bagikan di komentar. Baiklah, mari kita bicara tentang template yang ringan. Ringan adalah pola desain struktural di mana objek yang menampilkan dirinya sebagai contoh unik di tempat berbeda dalam program, pada kenyataannya, tidak demikian. Ringan menghemat memori dengan berbagi status objek yang dibagikan satu sama lain, alih-alih menyimpan data yang sama di setiap objek. Untuk memahami esensinya, mari kita lihat contoh paling sederhana. Katakanlah kita memiliki antarmuka karyawan:
public interface Employee {
   void work();
}
Dan ada beberapa implementasi, misalnya pengacara:
public class Lawyer implements Employee {

   public Lawyer() {
       System.out.println("Юрист взят в штат.");
   }

   @Override
   public void work() {
       System.out.println("Решение юридических вопросов...");
   }
}
Dan akuntan:
public class Accountant implements Employee{

   public Accountant() {
       System.out.println("Бухгалтер взят в штат.");
   }

   @Override
   public void work() {
       System.out.println("Ведение бухгалтерского отчёта....");
   }
}
Metode-metodenya sangat bersyarat: kita hanya perlu memastikan bahwa metode-metode tersebut dilaksanakan. Situasi yang sama berlaku untuk konstruktor. Berkat keluaran konsol, kita akan melihat kapan objek baru dibuat. Kami juga memiliki departemen karyawan, yang tugasnya mengeluarkan karyawan yang diminta, dan jika dia tidak ada, pekerjakan dia dan berikan sebagai tanggapan atas permintaan tersebut:
public class StaffDepartment {
   private Map<String, Employee> currentEmployees = new HashMap<>();

   public Employee receiveEmployee(String type) throws Exception {
       Employee result;
       if (currentEmployees.containsKey(type)) {
           result = currentEmployees.get(type);
       } else {
           switch (type) {
               case "Бухгалтер":
                   result = new Accountant();
                   currentEmployees.put(type, result);
                   break;
               case "Юрист":
                   result = new Lawyer();
                   currentEmployees.put(type, result);
                   break;
               default:
                   throw new Exception("Данный сотрудник в штате не предусмотрен!");
           }
       }
       return result;
   }
}
Artinya, logikanya sederhana: jika ada unit tertentu, kembalikan; jika tidak, buat, letakkan di penyimpanan (seperti cache) dan kembalikan. Sekarang mari kita lihat cara kerjanya:
public static void main(String[] args) throws Exception {
   StaffDepartment staffDepartment = new StaffDepartment();
   Employee empl1  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl2  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl3  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl4  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl5  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl6  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl7  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl8  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
   Employee empl9  = staffDepartment.receiveEmployee("Юрист");
   empl1.work();
   Employee empl10  = staffDepartment.receiveEmployee("Бухгалтер");
   empl2.work();
}
Dan di konsol, karenanya, akan ada output:
Pengacara telah disewa. Memecahkan masalah hukum... Seorang akuntan telah dipekerjakan. Memelihara laporan akuntansi.... Menyelesaikan masalah hukum... Memelihara laporan akuntansi.... Memecahkan masalah hukum... Memelihara laporan akuntansi.... Menyelesaikan masalah hukum... Memelihara laporan akuntansi.... Memecahkan masalah hukum.... Memelihara laporan akuntansi...
Seperti yang Anda lihat, hanya dua objek yang dibuat, yang digunakan kembali berkali-kali. Contohnya sangat sederhana, namun dengan jelas menunjukkan bagaimana penggunaan template ini dapat menghemat sumber daya kita. Seperti yang Anda perhatikan, logika pola ini sangat mirip dengan logika kumpulan asuransi. Anda dapat membaca lebih lanjut mengenai jenis-jenis pola GOF di artikel ini .Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 7 - 3

64. Bagaimana cara membagi string menjadi beberapa bagian? Harap berikan contoh kode yang sesuai

Jelas sekali, pertanyaan ini adalah tentang metode split . Kelas String memiliki dua variasi metode ini:
String split(String regex);
Dan
String split(String regex);
regex adalah pemisah garis - beberapa ekspresi reguler yang membagi string menjadi array string, misalnya:
String str = "Hello, world it's Amigo!";
String[] arr = str.split("\\s");
for (String s : arr) {
  System.out.println(s);
}
Berikut ini akan menjadi output ke konsol:
Halo dunia, ini Amigo!
Artinya, nilai string kita dipecah menjadi array string dan pemisahnya adalah spasi (untuk pemisahan, kita dapat menggunakan ekspresi reguler non-spasi "\\s" dan hanya ekspresi string " " ). Metode kedua yang kelebihan beban memiliki argumen tambahan - limit . limit — nilai maksimum yang diperbolehkan dari array yang dihasilkan. Artinya, ketika string telah dipecah menjadi jumlah substring maksimum yang diperbolehkan, tidak akan ada pemisahan lebih lanjut, dan elemen terakhir akan memiliki “sisa” dari string yang mungkin dipecah. Contoh:
String str = "Hello, world it's Amigo!";
String[] arr = str.split(" ", 2);
for (String s : arr) {
  System.out.println(s);
}
Keluaran konsol:
Halo dunia, ini Amigo!
Seperti yang bisa kita lihat, jika bukan karena batasan limit = 2 , elemen terakhir array dapat dipecah menjadi tiga substring.Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 7 - 4

65. Mengapa array karakter lebih baik daripada string untuk menyimpan kata sandi?

Ada beberapa alasan untuk memilih array daripada string ketika menyimpan kata sandi: 1. Kumpulan string dan kekekalan string. Saat menggunakan array ( char[] ), kita dapat menghapus data secara eksplisit setelah kita selesai menggunakannya. Selain itu, kita dapat menulis ulang array sebanyak yang kita inginkan, dan kata sandi yang valid tidak akan ada di sistem mana pun, bahkan sebelum pengumpulan sampah (cukup dengan mengubah beberapa sel ke nilai yang tidak valid). Pada saat yang sama, String adalah kelas yang tidak dapat diubah. Artinya, jika kita ingin mengubah nilainya, kita akan mendapatkan yang baru, sedangkan yang lama akan tetap berada di string pool. Jika kita ingin menghapus nilai String dari sebuah kata sandi, ini bisa menjadi tugas yang sangat sulit, karena kita memerlukan pengumpul sampah untuk menghapus nilai dari kumpulan String , dan ada kemungkinan besar bahwa nilai String ini akan tetap ada selama beberapa waktu. lama. Artinya, dalam situasi ini, String lebih rendah daripada array char dalam hal keamanan penyimpanan data. 2. Jika nilai String secara tidak sengaja dikeluarkan ke konsol (atau log), nilai itu sendiri akan ditampilkan:
String password = "password";
System.out.println("Пароль - " + password);
Keluaran konsol:
Kata sandi
Pada saat yang sama, jika Anda secara tidak sengaja mengeluarkan array ke konsol:
char[] arr = new char[]{'p','a','s','s','w','o','r','d'};
System.out.println("Пароль - " + arr);
Akan ada gobbledygook yang tidak dapat dipahami di konsol:
Kata Sandi - [C@7f31245a
Sebenarnya bukan gobbledygook, tapi: [C adalah nama kelasnya adalah array char , @ adalah pemisah, diikuti dengan 7f31245a adalah kode hash heksadesimal. 3. Dokumen resmi, Panduan Arsitektur Kriptografi Java, secara eksplisit menyebutkan penyimpanan kata sandi di char[] alih-alih String : “Tampaknya logis untuk mengumpulkan dan menyimpan kata sandi dalam objek bertipe java.lang.String . Namun, ada peringatan di sini: Objek string tidak dapat diubah, yaitu, tidak ada metode yang ditentukan untuk mengizinkan konten objek String dimodifikasi (ditimpa) atau dibatalkan setelah digunakan. Fitur ini membuat objek String tidak cocok untuk menyimpan informasi sensitif seperti kata sandi pengguna. Sebaliknya, Anda harus selalu mengumpulkan dan menyimpan informasi keamanan sensitif dalam rangkaian karakter.”Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 7 - 5

enum

66. Berikan penjelasan singkat tentang Enum di Java

Enum adalah enumerasi, sekumpulan konstanta string yang disatukan oleh tipe yang sama. Dideklarasikan melalui kata kunci - enum . Berikut ini contoh enum - peran yang valid di sekolah tertentu:
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD
}
Kata-kata yang ditulis dengan huruf kapital merupakan konstanta pencacahan yang sama yang dinyatakan secara sederhana, tanpa menggunakan operator baru . Penggunaan enumerasi sangat menyederhanakan hidup, karena membantu menghindari kesalahan dan kebingungan dalam penamaan (karena hanya ada daftar nilai tertentu). Secara pribadi, menurut saya mereka sangat nyaman ketika digunakan dalam desain logika Switch .

67. Bisakah Enum mengimplementasikan antarmuka?

Ya. Bagaimanapun, enumerasi harus mewakili lebih dari sekedar kumpulan pasif (seperti peran). Di Java, mereka dapat mewakili objek yang lebih kompleks dengan beberapa fungsi, jadi Anda mungkin perlu menambahkan fungsionalitas tambahan ke dalamnya. Ini juga akan memungkinkan Anda untuk menggunakan kemampuan polimorfisme dengan mengganti nilai enum di tempat di mana jenis antarmuka yang diimplementasikan diperlukan.

68. Bisakah Enum memperluas kelas?

Tidak, tidak bisa, karena enum adalah subkelas default dari kelas generik Enum <T> , dengan T mewakili tipe enum generik. Ini hanyalah kelas dasar umum untuk semua tipe enum bahasa Java. Konversi enum ke kelas dilakukan oleh kompiler Java pada waktu kompilasi. Ekstensi ini tidak secara eksplisit ditunjukkan dalam kode, tetapi selalu ada secara tidak terlihat.

69. Apakah mungkin membuat Enum tanpa instance objek?

Bagi saya, pertanyaannya agak aneh, atau saya belum sepenuhnya memahaminya. Saya memiliki dua interpretasi: 1. Bisakah ada enum tanpa nilai - ya tentu saja itu akan menjadi seperti kelas kosong - tidak ada artinya:
public enum Role {
}
Dan menelepon:
var s = Role.values();
System.out.println(s);
Kami akan menerima di konsol:
[Kelas Terbang.Peran;@9f70c54
(array nilai Peran kosong ) 2. Apakah mungkin membuat enum tanpa operator baru - ya, tentu saja. Seperti yang saya katakan di atas, Anda tidak perlu menggunakan operator baru untuk nilai enum (enumerasi) karena ini adalah nilai statis.

70. Bisakah kita mengganti metode toString() untuk Enum?

Ya, tentu saja Anda dapat mengganti metode toString() untuk menentukan cara tertentu menampilkan enum Anda saat memanggil metode toString (saat menerjemahkan enum ke dalam string biasa, misalnya, untuk keluaran ke konsol atau log).
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;

   @Override
   public String toString() {
       return "Выбрана роль - " + super.toString();
   }
}
Itu saja untuk hari ini, sampai bagian selanjutnya!Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 7 - 6
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION