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 7

Dipublikasikan di grup Acak
anggota
Hai semuanya! Pemrograman penuh dengan jebakan. Dan hampir tidak ada satu topik pun yang tidak akan membuat Anda tersandung dan tersandung. Hal ini terutama berlaku untuk pemula. Satu-satunya cara untuk menyelamatkan jari-jari kaki Anda adalah dengan belajar. Secara khusus, Anda perlu mendalami topik paling mendasar. Hari ini kami akan melanjutkan peninjauan pertanyaan paling populer selama wawancara untuk pengembang Java. Pertanyaan wawancara ini sangat baik dalam mencakup topik-topik dasar. Perhatikan bahwa daftar ini juga mencakup beberapa pertanyaan yang tidak terlalu standar yang memungkinkan Anda melakukan pendekatan terhadap masalah umum secara berbeda. Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 7 - 1

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

Bagian dari memori yang tersedia untuk program Java disebut heap (yang akan kita bicarakan nanti), dan bagian dari heap disebut String pool . Ini untuk menyimpan nilai string. Dengan kata lain, ketika Anda membuat string, misalnya menggunakan tanda kutip ganda seperti ini:
String str = "Hello world";
JVM memeriksa apakah kumpulan string sudah memiliki nilai yang ditentukan. Jika ya, maka variabel str diberi referensi ke nilai tersebut di kumpulan. Jika tidak, nilai baru dibuat di kumpulan, dan referensi ke nilai tersebut ditetapkan ke variabel str . Mari kita pertimbangkan sebuah contoh:
String firstStr = "Hello world";
String secondStr = "Hello world";
System.out.println(firstStr == secondStr);
benar akan ditampilkan di layar. Ingatlah bahwa == membandingkan referensi, dan kedua variabel ini menunjuk ke nilai yang sama di kumpulan string. Hal ini membantu menghindari pembuatan banyak objek String yang identik di memori. Kita bisa melakukan ini karena, seperti yang Anda ingat, String adalah kelas yang tidak dapat diubah, jadi tidak ada salahnya memiliki banyak referensi ke nilai yang sama. Sekarang tidak mungkin ada situasi di mana perubahan nilai di satu tempat mengakibatkan perubahan pada beberapa referensi lainnya. Tetap saja, jika kita membuat string menggunakan new :
String str = new String("Hello world");
kemudian objek terpisah dibuat di memori dan menyimpan nilai string yang ditentukan (tidak masalah jika nilai tersebut sudah ada di kumpulan string). Untuk mengkonfirmasi pernyataan ini, pertimbangkan ini:
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);
Kita akan mendapatkan dua baris yang menunjukkan false , yang berarti kita memiliki tiga string terpisah. Pada dasarnya, inilah mengapa Anda harus membuat string hanya dengan menggunakan tanda kutip ganda. Meskipun demikian, dimungkinkan untuk menambahkan (atau mendapatkan referensi ke) nilai dalam kumpulan string bahkan saat membuat objek menggunakan kata kunci baru . Untuk melakukan hal ini, kita menggunakan metode intern() dari kelas String . Metode ini memastikan bahwa kita membuat nilai di kumpulan string atau mendapatkan referensi ke sana jika sudah ada. 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);
Kode ini menghasilkan output true ke konsol sebanyak tiga kali, yang memberi tahu kita bahwa ketiga variabel merujuk ke string yang sama di memori.

63. Pola desain GoF apa yang digunakan di kumpulan string?

Pada string pool, pola desain GoF adalah pola flyweight . Jika Anda melihat pola desain lain di sini, bagikan di komentar. Di sini kita akan membahas tentang pola desain kelas terbang. Ini adalah pola desain struktural di mana suatu objek yang mewakili dirinya sebagai contoh unik di tempat berbeda dalam program sebenarnya tidak unik. Flyweight menghemat memori dengan menyimpan status bersama objek alih-alih menyimpan data identik di setiap objek. Untuk memahami intinya, perhatikan contoh dasar ini. Katakanlah kita memiliki antarmuka Karyawan :
public interface Employee {
   void work();
}
Dan memiliki beberapa implementasi, seperti kelas Pengacara :
public class Lawyer implements Employee {

   public Lawyer() {
       System.out.println("A lawyer was hired.");
   }

   @Override
   public void work() {
       System.out.println("Settling legal issues...");
   }
}
Dan kelas Akuntan :
public class Accountant implements Employee {

   public Accountant() {
       System.out.println("An accountant was hired.");
   }

   @Override
   public void work() {
       System.out.println("Keeping accounting records...");
   }
}
Metodenya sepenuhnya arbitrer — untuk contoh ini, kita hanya perlu melihat apakah metode tersebut dieksekusi. Hal yang sama juga berlaku pada konstruktor. Output konsol memberitahu kita kapan objek baru dibuat. Kami juga memiliki departemen sumber daya manusia yang tugasnya mengembalikan karyawan yang diminta. Jika karyawan tersebut belum menjadi staf, maka mereka akan dipekerjakan dan departemen SDM akan mengembalikan karyawan baru tersebut:
public class HumanResourcesDepartment {
   private Map<String, Employee> currentEmployees = new HashMap<>();

   public Employee getEmployee(String type) throws Exception {
       Employee result;
       if (currentEmployees.containsKey(type)) {
           result = currentEmployees.get(type);
       } else {
           switch (type) {
               case "Accountant":
                   result = new Accountant();
                   currentEmployees.put(type, result);
                   break;
               case "Lawyer":
                   result = new Lawyer();
                   currentEmployees.put(type, result);
                   break;
               default:
                   throw new Exception("This employee is not on the staff!");
           }
       }
       return result;
   }
}
Jadi, logikanya sederhana: jika objek yang diinginkan ada, kembalikan; jika tidak, buatlah, simpan di penyimpanan (seperti cache), dan kembalikan. Sekarang mari kita lihat cara kerjanya:
public static void main(String[] args) throws Exception {
   HumanResourcesDepartment humanResourcesDepartment = new HumanResourcesDepartment();
   Employee empl1 = humanResourcesDepartment.getEmployee("Lawyer");
   empl1.work();
   Employee empl2 = humanResourcesDepartment.getEmployee("Accountant");
   empl2.work();
   Employee empl3 = humanResourcesDepartment.getEmployee("Lawyer");
   empl1.work();
   Employee empl4 = humanResourcesDepartment.getEmployee("Accountant");
   empl2.work();
   Employee empl5 = humanResourcesDepartment.getEmployee("Lawyer");
   empl1.work();
   Employee empl6 = humanResourcesDepartment.getEmployee("Accountant");
   empl2.work();
   Employee empl7 = humanResourcesDepartment.getEmployee("Lawyer");
   empl1.work();
   Employee empl8 = humanResourcesDepartment.getEmployee("Accountant");
   empl2.work();
   Employee empl9 = humanResourcesDepartment.getEmployee("Lawyer");
   empl1.work();
   Employee empl10 = humanResourcesDepartment.getEmployee("Accountant");
   empl2.work();
}
Inilah yang akan kita lihat di konsol:
Seorang pengacara disewa. Menyelesaikan masalah hukum... Seorang akuntan dipekerjakan. Menyimpan catatan akuntansi... Menyelesaikan masalah hukum... Menyimpan catatan akuntansi... Menyelesaikan masalah hukum... Menyimpan catatan akuntansi... Menyelesaikan masalah hukum... Menyimpan catatan akuntansi... Menyelesaikan masalah hukum... Menjaga akuntansi catatan…
Seperti yang Anda lihat, kami hanya membuat dua objek dan menggunakannya kembali berkali-kali. Contohnya sangat sederhana, namun menunjukkan bagaimana pola desain ini dapat menghemat sumber daya kita. Seperti yang mungkin Anda ketahui, logika pola ini sangat mirip dengan logika kumpulan asuransi. Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 7 - 2

64. Bagaimana cara membagi string menjadi beberapa bagian? Berikan contoh kode yang relevan

Jelas sekali, pertanyaan ini adalah tentang metode split . Kelas String memiliki dua variasi metode ini:
String split(String regex);
Dan
String split(String regex);
Parameter regex adalah pembatas — beberapa ekspresi reguler yang digunakan untuk 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);
}
Konsol akan menampilkan:
Halo dunia, ini Amigo!
Jadi, string kita dipecah menjadi array string, menggunakan spasi sebagai pembatas (alih-alih ekspresi reguler "\\s" , kita juga bisa menggunakan ekspresi string biasa " " ). Varian kedua, varian kelebihan beban, memiliki parameter batas tambahan . limit adalah ukuran maksimum yang diperbolehkan dari array yang dihasilkan. Dengan kata lain, setelah string dipecah menjadi jumlah substring maksimum yang diperbolehkan, pemisahan berhenti, dan elemen terakhir akan berisi "sisa" dari string yang mungkin tidak 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 limit = 2 , elemen terakhir array dapat dipecah menjadi tiga substring.

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 mengerjakannya. Kita juga dapat menimpa array sebanyak yang kita inginkan, menghilangkan kata sandi dari sistem bahkan sebelum pengumpulan sampah (cukup mengubah beberapa sel menjadi nilai yang tidak valid). Sebaliknya, String adalah kelas yang tidak dapat diubah. Artinya jika kita ingin mengubah nilai suatu objek String , kita akan mendapatkan yang baru, tetapi yang lama akan tetap berada di kumpulan string. Jika kita ingin menghapus String yang berisi kata sandi, kita menghadapi tugas yang rumit karena kita memerlukan pengumpul sampah untuk menghapus nilai tersebut dari kumpulan string, tetapi String tersebut kemungkinan akan tetap ada di sana untuk waktu yang lama. Artinya, dalam hal penyimpanan data yang aman, String lebih rendah daripada array char .

2. Jika kita mengeluarkan nilai String ke konsol (atau log), maka kita mendapatkan:

String password = "password";
System.out.println("Password - " + password);
Keluaran konsol:
Kata sandi - kata sandi
Dan jika Anda mencetak array ke konsol:
char[] arr = new char[]{'p','a','s','s','w','o','r','d'};
System.out.println("Password - " + arr);
konsol akan menampilkan omong kosong yang tidak dapat dipahami:
Kata Sandi - [C@7f31245a
Faktanya, ini bukan omong kosong. Berikut cara memahami apa yang Anda lihat: [C adalah nama kelas - array char , @ adalah pembatas, dan 7f31245a adalah kode hash heksadesimal.

3. Panduan Referensi Arsitektur Kriptografi Java (JCA) resmi secara eksplisit menyebutkan penyimpanan kata sandi dalam char[] alih-alih String :

"Tampaknya logis untuk mengumpulkan dan menyimpan kata sandi dalam objek bertipe java.lang.String . Namun, inilah peringatannya: Objek bertipe String tidak dapat diubah, yaitu, tidak ada metode yang ditentukan yang memungkinkan Anda mengubah (menimpa) atau menghilangkan konten String setelah digunakan. Fitur ini membuat objek String tidak cocok untuk menyimpan informasi sensitif keamanan seperti kata sandi pengguna. Anda harus selalu mengumpulkan dan menyimpan informasi sensitif keamanan dalam array char." Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 7 - 3

enum

66. Berikan penjelasan singkat tentang Enum di Java

Enum adalah kependekan dari enumerasi, yang merupakan sekumpulan konstanta string yang disatukan oleh tipe yang sama. Kami mendeklarasikannya menggunakan kata kunci enum . Berikut ini contoh dengan enum : peran yang diizinkan di beberapa kampus sekolah:
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD
}
Kata-kata yang ditulis dengan huruf kapital merupakan konstanta pencacahan. Mereka dideklarasikan dengan cara yang disederhanakan, tanpa operator baru . Menggunakan enumerasi membuat hidup lebih mudah karena membantu menghindari kesalahan dan kebingungan dalam nama (karena daftar hanya mendefinisikan nilai yang valid). Bagi saya, mereka sangat nyaman dalam konstruksi saklar .

67. Bisakah Enum mengimplementasikan antarmuka (menggunakan kata kunci implementasi)?

Ya. Bagaimanapun, enum harus mewakili lebih dari sekedar himpunan pasif (seperti peran di kampus sekolah). Di Java, mereka dapat mewakili objek yang lebih kompleks, jadi Anda mungkin perlu menambahkan fungsionalitas tambahan ke dalamnya. Ini juga memungkinkan Anda memanfaatkan polimorfisme dengan mengganti nilai enum di tempat yang memerlukan tipe antarmuka yang diimplementasikan.

68. Bisakah Enum memperluas kelas (gunakan kata kunci extends)?

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

69. Apakah mungkin membuat Enum tanpa objek apa pun?

Pertanyaan ini agak membingungkan, dan saya tidak yakin saya sepenuhnya memahaminya. Saya memiliki dua interpretasi: 1. Bisakah Anda memiliki enum tanpa nilai apa pun? Ya, tentu saja, tapi itu akan menjadi seperti kelas yang kosong — tidak ada gunanya, misalnya
public enum Role {
}
Dan jika kita menelepon:
var s = Role.values();
System.out.println(s);
Kami mendapatkan yang berikut di konsol:
[Kelas Terbang.Peran;@9f70c54
(array nilai Peran yang kosong ) 2. Apakah mungkin membuat enum tanpa operator baru ? Ya, tentu saja. Seperti yang saya katakan di atas, Anda tidak menggunakan operator baru untuk nilai enum, karena nilai tersebut adalah nilai statis.

70. Bisakah kita mengganti metode toString() Enum?

Ya, tentu saja Anda dapat mengganti metode toString() untuk menentukan cara menampilkan enum Anda saat metode toString dipanggil (saat mengonversi enum menjadi string biasa, misalnya, untuk menampilkannya ke konsol atau log).
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;

   @Override
   public String toString() {
       return "Selected role - " + super.toString();
   }
}
Itu saja untukku hari ini. Sampai bagian selanjutnya!
Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar