JavaRush /Java Blog /Random-ID /50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas. Ba...

50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas. Bagian 2

Dipublikasikan di grup Random-ID
50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas. Bagian 1 50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 2 - 1

Koleksi

25. Apa yang dimaksud dengan Koleksi di Java?

Koleksi adalah kerangka kerja yang dirancang untuk menyimpan dan memanipulasi objek. Digunakan untuk melakukan operasi berikut:
  • mencari;
  • penyortiran;
  • manipulasi;
  • tambahan;
  • penghapusan.
Semua kelas dan antarmuka untuk kerangka Koleksi ada dalam java.utilpaket.

26. Kelas dan antarmuka apa yang tersedia dalam kerangka Koleksi?

Antarmuka:
  • Koleksi;
  • Daftar;
  • Mengatur;
  • Peta;
  • Kumpulan yang Diurutkan;
  • Peta yang Diurutkan;
  • Antre.
Kelas:
  • Daftar:
    1. Daftar Array;
    2. Daftar Tertaut;
    3. Vektor (tidak digunakan lagi).
  • Set:
    1. Set Hash;
    2. LinkedHashSet;
    3. Set Pohon.
  • Peta:
    1. Peta Hash
    2. Peta Pohon
    3. HashTable (tidak digunakan lagi)
    4. LinkedHashMap
  • Antre
    1. Antrian Prioritas.

27. Apa yang dimaksud dengan pengurutan dan pengurutan dalam koleksi?

Dipesan:

Artinya barang-barang yang disimpan dalam koleksi didasarkan pada nilai-nilai yang ditambahkan pada koleksi tersebut. Dengan cara ini kita dapat mengulangi nilai-nilai dari koleksi dalam urutan tertentu. Dengan kata lain, unsur-unsur koleksi mempunyai tatanan tersendiri yang sesuai dengan susunannya. Untuk pemahaman yang lebih baik, koleksi yang tidak diurutkan menyimpan elemen-elemennya dalam urutan acak. Misalnya Set.

Diurutkan:

Artinya sekelompok elemen diurutkan menjadi kumpulan berdasarkan data elemen kumpulan tersebut. Artinya, koleksinya tidak hanya diurutkan, tetapi urutan elemennya juga bergantung pada nilainya. Urutan ini dapat berubah jika Anda mengurutkan berdasarkan nilai elemen yang berbeda.

28. Koleksi apa saja yang ada dengan antarmuka Daftar? Bagaimana Anda bekerja dengan Daftar?

Nilai elemen dalam lembar didasarkan pada indeksnya—nilai tersebut diurutkan berdasarkan indeks. Pengulangan elemen diperbolehkan (yaitu, Anda dapat menambahkan objek yang sama ke koleksi beberapa kali dan itu akan baik-baik saja).

Daftar Array:

Koleksi paling umum. Pada dasarnya, ini adalah array dengan ukuran yang berkembang secara dinamis. Tugas mengelola ukuran array terletak pada koleksi. Penting bagi kita untuk memahami bahwa dalam banyak kasus inilah yang perlu kita gunakan. Keunikan:
  • pencarian cepat dan pencarian indeks cepat;
  • koleksi diurutkan berdasarkan indeks, tetapi tidak diurutkan;
  • mengimplementasikan antarmuka RandomAccess;
  • perlahan menambahkan ke tengah daftar.
Contoh:
public class A {

   public static void main(String[] args) {
       ArrayList names = new ArrayList<>();
       names.add("John");
       names.add("John");
       names.add("Roman");
       names.add("Ivan");
   }

}
>> keluaran

   [John, John, Roman, Ivan]
Outputnya menunjukkan bahwa ini adalah elemen yang dapat diulang. Mereka ditampilkan sesuai urutan pencatatannya. Apa lagi yang harus dibaca? Ya, ada banyak informasi, Anda bahkan tidak perlu keluar dari JavaRush:

Daftar Tertaut:

Ini adalah kumpulan di mana setiap elemen memiliki tautan ke elemen sebelumnya dan berikutnya. Tautan ini memungkinkan Anda berpindah dari satu elemen ke elemen lainnya. Saat menambahkan elemen, tautan ke elemen sebelumnya dan berikutnya berubah begitu saja: 50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 2 - 2
  • elemen-elemennya terhubung satu sama lain, yaitu, daftar tertaut ganda diterapkan;
  • kecepatan operasi secara keseluruhan jauh lebih rendah dibandingkan di ArrayList;
  • pilihan yang sangat baik untuk sejumlah besar penyisipan dan penghapusan di tengah-tengah array;
  • mengimplementasikan antarmuka daftar Antrian dan Deque, dan oleh karena itu memiliki metode kerjanya masing-masing.
Contoh:
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("One");
linkedList.add("Two");
linkedList.add("Three");

29. Ceritakan tentang pengumpulan Peta dan implementasinya?

Peta adalah kumpulan nilai kunci. Ada kunci unik dan nilai yang cocok dengan nilai tersebut. equals()Metode juga digunakan hashcode()untuk menentukan keunikan suatu kunci.

Peta Hash:

  • tidak disortir atau dipesan;
  • digunakan jika urutan dan penyortiran tidak penting;
  • mendukung kunci nol.
Contoh:
public class CollectionExample {

   public static void main(String[] args) {
       HashMap positions = new HashMap<>();
       positions.put("junior", "Ivan");
       positions.put("middle", "Roman");
       positions.put("senior", "Vasily");
       positions.put("team lead", "Anton");
       positions.put("arthitect", "Andrew");
       positions.put("senior", "John");
       System.out.println(positions);
   }
}

// вывод в консоль
// {junior=Ivan, middle=Roman, senior=John, team lead=Anton, arthitect=Andrew}
Kuncinya selalu unik, jadi hanya satu senior yang tercatat.

Peta Hash Tertaut:

  • mempertahankan perintah penyisipan;
  • lebih lambat dari HashMap;
  • iterasi diharapkan lebih cepat daripada di HashMap.
Contoh:
public class CollectionExample {

   public static void main(String[] args) {
       LinkedHashMap<String, String> positions = new LinkedHashMap<>();
       positions.put("junior", "Ivan");
       positions.put("middle", "Roman");
       positions.put("senior", "Vasily");
       positions.put("team lead", "Anton");
       positions.put("arthitect", "Andrew");
       positions.put("senior", "John");
       System.out.println(positions);
   }
}

// вывод в консоль
// {junior=Ivan, middle=Roman, senior=John, team lead=Anton, arthitect=Andrew}

Peta Pohon:

Implementasi peta yang membuat entri diurutkan berdasarkan urutan alami kuncinya, atau lebih baik lagi, menggunakan pembanding jika tersedia di konstruktor saat peta dibuat. Contoh:
  1. Tanpa pembanding

    public class CollectionExample {
    
       public static void main(String[] args) {
           TreeMap<Integer, String> positions = new TreeMap<>();
           positions.put(1, "Ivan");
           positions.put(3, "Roman");
           positions.put(2, "Vasily");
           positions.put(10, "Anton");
           positions.put(7, "Andrew");
           positions.put(1, "John");
           System.out.println(positions);
       }
    }
    
    // вывод в консоль
    // {1=John, 2=Vasily, 3=Roman, 7=Andrew, 10=Anton}
  2. Dengan pembanding

    public class CollectionExample {
    
       public static void main(String[] args) {
           //используем реализацию Strategy Pattern'a и добавим компаратор:
           TreeMap<Integer, String> positions = new TreeMap<>(Comparator.reverseOrder());
           positions.put(1, "Ivan");
           positions.put(3, "Roman");
           positions.put(2, "Vasily");
           positions.put(10, "Anton");
           positions.put(7, "Andrew");
           positions.put(1, "John");
           System.out.println(positions);
       }
    }
    
    // вывод в консоль
    // {10=Anton, 7=Andrew, 3=Roman, 2=Vasily, 1=John}
Kita melihat bahwa pengurutan dalam urutan menaik diterapkan sebagai standar, tetapi hal ini dapat diubah dengan menambahkan pembanding ke konstruktor. TreeMap dijelaskan dengan baik di sini .

30. Ceritakan tentang koleksi Set dan implementasinya?

Himpunan adalah sekumpulan elemen unik, dan inilah ciri utamanya. Artinya, Set tidak memperbolehkan elemen yang sama diulang. Penting di sini bahwa objek yang ditambahkan memiliki metode yang diimplementasikan equals .

Kumpulan Hash:

  • tidak disortir atau dipesan. Di bawah tenda ada HashMap dengan placeholder untuk nilainya. Lihat diri mu sendiri ;)
  • menggunakan kode hash untuk menambahkan objek;
  • Ini harus digunakan ketika Anda perlu memiliki objek unik dan urutannya tidak penting.
Contoh:
public class CollectionExample {

   public static void main(String[] args) {
       HashSet<String> positions = new HashSet<>();
       positions.add("junior");
       positions.add("junior");
       positions.add("middle");
       positions.add("senior");
       positions.add("team lead");
       positions.add("architect");
       System.out.println(positions);
   }
}

// вывод в консоль
// [senior, middle, team lead, architect, junior]
Di sini Anda dapat melihat bahwa elemen “junior”, yang ditambahkan dua kali, hanya ada dalam satu contoh. Dan urutannya tidak sama dengan saat penambahan.

LinkedHashSet:

  • versi HashSet yang dipesan;
  • memelihara daftar tertaut ganda untuk semua elemen;
  • Gunakan saat Anda membutuhkan keteraturan dalam iterasi Anda.
Contoh:
public class CollectionExample {

   public static void main(String[] args) {
       LinkedHashSet<String> positions = new LinkedHashSet<>();
       positions.add("junior");
       positions.add("junior");
       positions.add("middle");
       positions.add("senior");
       positions.add("team lead");
       positions.add("architect");
       System.out.println(positions);
   }
}

// вывод в консоль
// [senior, middle, team lead, architect, junior]

Kumpulan Pohon:

  • salah satu dari dua koleksi yang diurutkan;
  • menggunakan struktur pohon merah-hitam dan memastikan bahwa elemen berada dalam urutan menaik;
  • Di bawah tenda itu adalah TreeMap dengan rintisan pada nilai-nilai. Dan elemen dari TreeSet adalah kunci dari TreeMap (lihat juga ;)).
Contoh:
public class CollectionExample {

   public static void main(String[] args) {
       TreeSet<String> positions = new TreeSet<>();
       positions.add("junior");
       positions.add("junior");
       positions.add("middle");
       positions.add("senior");
       positions.add("team lead");
       positions.add("architect");
       System.out.println(positions);
   }
}

// вывод в консоль
// [architect, junior, middle, senior, team lead]

Pengecualian

31. Apa yang dimaksud dengan Pengecualian?

Pengecualian adalah masalah yang bisa terjadi saat runtime. Ini adalah situasi luar biasa yang muncul karena alasan tertentu. Diagram pewarisan pengecualian terlihat seperti ini (Anda harus hafal;)): 50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 2 - 3Diagram menunjukkan bahwa, secara umum, semua pengecualian dibagi menjadi dua kelompok - pengecualian dan kesalahan. Kesalahan - JVM digunakan untuk menampilkan kesalahan yang menyebabkan aplikasi tidak lagi masuk akal. Misalnya StackOverFlowError yang menyatakan bahwa tumpukan sudah penuh dan program tidak dapat dijalankan lagi. Pengecualian - pengecualian yang dihasilkan secara terprogram dalam kode. Ada pengecualian yang berbeda, dicentang dan tidak dicentang, tetapi yang utama adalah pengecualian tersebut ada, dan dapat ditangkap dan aplikasi terus berfungsi. Pengecualian, pada gilirannya, dibagi lagi menjadi pengecualian yang mewarisi RuntimeException dan turunan Exception lainnya. Ada cukup informasi mengenai masalah ini. Kami akan membicarakan tentang pengecualian yang dicentang/tidak dicentang di bawah.

32. Bagaimana JVM menangani pengecualian?

Bagaimana itu bekerja? Segera setelah pengecualian dilemparkan ke suatu tempat, runtime membuat Objek Pengecualian (dilambangkan sebagai ExcObj). Ini menyimpan semua informasi yang diperlukan untuk pekerjaan - pengecualian itu sendiri yang dilemparkan dan tempat kejadiannya. Penciptaan ExcObjdan transmisi ke runtime tidak lebih dari “melemparkan pengecualian.” ExcObjberisi metode yang dapat digunakan untuk mencapai tempat di mana pengecualian dilemparkan. Kumpulan metode ini disebut Call Stack. Selanjutnya, sistem runtime mencari metode di Call Stack yang dapat menangani pengecualian kita. Jika ia menemukan penangan yang sesuai, yaitu tipe pengecualian cocok dengan tipe di penangan, semuanya baik-baik saja. Jika tidak menemukannya, runtime meneruskan semuanya ke pengendali pengecualian default, yang menyiapkan respons dan keluar. Tampilannya secara visual:
/**
* Пример, в котором показываются две опции — когда находится обработчик для исключения и когда нет.
*/
class ThrowerExceptionExample {

   public static void main(String[] args) throws IllegalAccessException {

       ThrowerExceptionExample example = new ThrowerExceptionExample();

       System.out.println(example.populateString());
   }

   /**
    * Здесь происходит перехват одного из возможных исключений — {@link IOException}.
    * А вот второй будет пробрасываться дальше вверх по вызову.
    */
   private String populateString() throws IllegalAccessException {
       try {
           return randomThrower();
       } catch (IOException e) {
           return "Caught IOException";
       }
   }

   /**
    * Здесь две опции: or бросается {@link IOException} or {@link IllegalAccessException}.
    * Выбирается случайным образом.
    */
   private String randomThrower() throws IOException, IllegalAccessException {
       if (new Random().nextBoolean()) {
           throw new IOException();
       } else {
           throw new IllegalAccessException();
       }
   }
}
Dalam kasus kami, CallStack secara skematis akan terlihat seperti:

randomThrower() => populateString() => main(String[] args)
Ada dua opsi: satu atau pengecualian lainnya akan dilempar secara acak. Untuk IOException semuanya baik-baik saja, jika di-generate maka hasil kerjanya adalah: "Caught IOException". Namun jika ada pengecualian kedua yang tidak ada pengendalinya, program akan berhenti dengan output berikut:

Exception in thread "main" java.lang.IllegalAccessException
  at ThrowerExceptionExample.randomThrower(CollectionExample.java:38)
  at ThrowerExceptionExample.populateString(CollectionExample.java:24)
  at ThrowerExceptionExample.main(CollectionExample.java:15)

33. Bagaimana cara programmer menangani pengecualian?

Dalam pertanyaan di atas, kata kunci tertentu telah digunakan untuk bekerja dengan pengecualian; sekarang kita perlu membicarakannya lebih detail. Apa kata kuncinya?
  • mencoba
  • menangkap
  • melemparkan
  • melempar
  • Akhirnya
Penting untuk diperhatikan bahwa catch, throw, dan throw hanya dapat digunakan dengan java.lang.Throwable. Ini tidak akan berfungsi pada tipe lainnya. Sekarang kita akan membahas coba, tangkap dan akhirnya.
  • try-catch-finallyadalah konstruksi yang memungkinkan Anda menangkap dan menangani pengecualian dengan benar.
  • try- hanya ada satu waktu, di situlah logikanya terjadi;
  • catch— sebuah blok yang menerima beberapa jenis pengecualian; mungkin ada banyak pengecualian. Misalnya, blok try akan memunculkan beberapa pengecualian yang tidak ada hubungannya satu sama lain;
  • finally- "akhirnya" blok ini. Ini adalah blok yang akan dieksekusi bagaimanapun juga, apapun yang dilakukan saat try, catch.
Ini adalah tampilannya:
try {
   // сюда передают тот code, который может вызвать исключение.
} catch (IOException e) {
   // первый catch блок, который принимает IOException и все его подтипы(потомки).
   // Например, нет file при чтении, выпадает FileNotFoundException, и мы уже соответствующе
   // обрабатываем это.
} catch (IllegalAccessException e) {
   // если нужно, можно добавить больше одного catch блока, в этом нет проблем.
} catch (OneException | TwoException e) {
   // можно даже объединять несколько в один блок
} catch (Throwable t) {
   // а можно сказать, что мы принимаем ВСЁ))))
} finally {
   // этот блок может быть, а может и не быть.
   // и он точно выполнится.
}
Bacalah deskripsi contoh dengan cermat dan semuanya akan menjadi jelas)

34. lempar dan lempar dalam bahasa jawa

melemparkan

throwdigunakan ketika Anda perlu membuat pengecualian baru secara eksplisit. Ini digunakan untuk membuat dan membuang pengecualian khusus. Misalnya, pengecualian terkait validasi. Biasanya, untuk validasi, mereka mewarisi dari RuntimeException. Contoh:
// пример пробрасывания исключения
throw new RuntimeException("because I can :D");
Penting bahwa konstruksi ini hanya dapat digunakan oleh sesuatu yang diwarisi darinya Throwable. Artinya, Anda tidak bisa mengatakan ini:
throw new String("How тебе такое, Илон Маск?");
Selanjutnya, pekerjaan thread dihentikan dan pencarian penangan yang dapat memprosesnya dimulai. Ketika tidak menemukannya, ia akan menuju ke metode yang memanggilnya, sehingga pencarian akan naik ke jalur panggilan hingga ia menemukan pengendali yang sesuai atau membiarkan aplikasi tetap berjalan. Mari lihat:
// Пример, который демонстрирует работу throw
class ThrowExample {

   void willThrow() throws IOException {
       throw new IOException("Because I Can!");
   }

   void doSomething() {
       System.out.println("Doing something");
       try {
           willThrow();
       } catch (IOException e) {
           System.out.println("IOException was successfully handled.");
       }
   }

   public static void main(String args[]) {
       ThrowExample throwExample = new ThrowExample();
       throwExample.doSomething();
   }
}
Jika kita menjalankan programnya, kita mendapatkan hasil sebagai berikut:

Doing something
IOException was successfully handled.

melempar

throws— mekanisme dimana suatu metode dapat memunculkan satu atau lebih pengecualian. Mereka ditambahkan dipisahkan dengan koma. Mari kita lihat betapa mudah dan sederhananya:
private Object willThrow() throws RuntimeException, IOException, FileNotFoundException
Selain itu, penting untuk dicatat bahwa ada pengecualian yang dicentang dan tidak dicentang. Tentu saja, pengecualian yang tidak dicentang tidak boleh ditambahkan ke throws, tetapi sopan santun mengatakan sebaliknya. Jika ini dapat diperiksa, maka dengan menggunakan metode yang menghasilkannya, Anda perlu memprosesnya. Ada dua pilihan:
  1. Tulis try-catchdengan pengecualian warisan yang sesuai dan di atas.
  2. Gunakan throwsdengan cara yang persis sama sehingga orang lain sudah mengalami masalah ini :D

35. Pengecualian yang dicentang dan tidak dicentang di Java

Ada dua jenis pengecualian di Java - dicentang dan tidak dicentang.

Pengecualian yang diperiksa:

Ini adalah pengecualian yang diperiksa pada waktu kompilasi. Jika beberapa kode dalam suatu metode memunculkan pengecualian yang dicentang selama pengecualian, metode tersebut harus memprosesnya menggunakan try-catch, atau meneruskannya lebih lanjut. Misalnya, yang membaca gambar dari jalur "/users/romankh3/image.png", memperbaruinya dalam beberapa hal (bagi kami ini tidak penting) dan menyimpannya kembali.
class CheckedImageExample {
   public static void main(String[] args) {
       File imageFile = new File("/users/romankh3/image.png");
       BufferedImage image = ImageIO.read(imageFile);
       updateAndSaveImage(image, imageFile);
   }

   private static void updateAndSaveImage(BufferedImage image, File imageFile) {
       ImageIO.write(image, "png", imageFile);
   }
}
Kode tersebut tidak akan dikompilasi, karena metode statis ImageIO.read()memunculkan ImageIO.write()IOException, yang diperiksa dan harus ditangani sebagaimana mestinya. Ada dua opsi di sini yang telah kita bahas di atas: gunakan try-catch, atau teruskan lebih jauh. Untuk asimilasi yang lebih baik, kami akan melakukan ini dan itu. Artinya, updateAndSavekita hanya meneruskannya di metode, lalu menggunakannya di metode utama try-catch:
class CheckedImageExample {
   public static void main(String[] args) {
       File imageFile = new File("/users/romankh3/image.png");
       try {
           BufferedImage image = ImageIO.read(imageFile);
           updateAndSaveImage(image, imageFile);
       } catch (IOException e) {
           e.printStackTrace();
       }
   }

   private static void updateAndSaveImage(BufferedImage image, File imageFile) throws IOException {
       ImageIO.write(image, "png", imageFile);
   }
}

Pengecualian yang tidak dicentang:

Ini adalah pengecualian yang tidak diperiksa pada tahap kompilasi. Artinya, suatu metode dapat menghasilkan RuntimeException, tetapi kompiler tidak akan mengingatkan Anda untuk menanganinya. Seperti yang ditunjukkan di bawah ini, semua yang diwarisi dari RuntimeException dan Error tidak dicentang. 50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 2 - 4Perhatikan program Java berikut. Kode dikompilasi dengan baik, tetapi memunculkan pengecualian saat run ArrayIndexOutOfBoundsException. Kompiler mengizinkannya untuk dikompilasi karena ArrayIndexOutOfBoundsExceptionini merupakan pengecualian yang tidak dicentang. Situasi umum dengan array, yang dapat berupa:
class CheckedImageExample {
   public static void main(String[] args) {
       int[] array = new int[3];
       array[5] = 12;
   }
}
Hasilnya adalah:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
  at main(CheckedImageExample.java:12)
Ngomong-ngomong, pernahkah Anda memperhatikan bahwa di Jawa tidak ada yang memberi nama pendek? Lebih besar lebih baik. Dia, Spring Framework, sangat sukses dalam hal ini: ambil saja beberapa kelas BeanFactoryPostProcessor )))

36. Apa yang dimaksud dengan percobaan dengan sumber daya?

Ini adalah mekanisme dimana semua sumber daya harus ditutup dengan benar. Entah bagaimana tidak jelas, kan?) Pertama-tama, apa itu sumber daya... Sumber daya adalah sebuah objek, setelah dikerjakan Anda harus menutupnya, yaitu memanggil close(). Sumber daya mengacu pada semua objek yang mengimplementasikan antarmuka AutoClosable, yang pada gilirannya mengimplementasikan antarmuka Closeable. Penting bagi kita untuk memahami bahwa segala sesuatu InputStreamadalah OutpuStreamsumber daya dan perlu dilepaskan dengan benar dan sukses. Inilah tepatnya mengapa kita perlu menggunakan try-with-resourcestruktur tersebut. Berikut tampilannya:
private void unzipFile(File zipFile) throws IOException {
   try(ZipInputStream zipOutputStream = new ZipInputStream(new FileInputStream(zipFile))) {
       ZipEntry zipEntry = zipOutputStream.getNextEntry();
       while (zipEntry != null) {

       }
   }
}

private void saveZipEntry(ZipEntry zipEntry) {
   // логика сохранения
}
Dalam contoh ini, sumber dayanya adalah ZipInputStream, setelah dikerjakan Anda harus menutupnya. Dan agar tidak berpikir untuk memanggil metode ini close(), kita cukup mendefinisikan variabel ini di blok try, seperti yang ditunjukkan pada contoh, dan di dalam blok ini kita melakukan semua yang diperlukan. Apa fungsi dari contoh tersebut? Ini akan mengekstrak arsip zip. Untuk melakukan ini, Anda perlu menggunakan InputStream'om. Anda dapat mendefinisikan lebih dari satu variabel; mereka dipisahkan oleh titik koma. Apa masalahnya? Tapi Anda bisa menggunakan finallyblok, bisa dibilang begitu. Berikut artikel yang merinci masalah dengan pendekatan ini. Dijelaskan juga seluruh daftar kegagalan yang bisa menimpa seseorang yang lalai menggunakan desain ini. Saya sarankan membacanya ;) Di bagian akhir ada tanya jawab tentang topik Multithreading. Profil GitHub saya
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION