JavaRush /Blog Java /Random-MS /50 Soalan dan Jawapan Temuduga Teras Java Teratas. Bahagi...

50 Soalan dan Jawapan Temuduga Teras Java Teratas. Bahagian 2

Diterbitkan dalam kumpulan
50 Soalan dan Jawapan Temuduga Teras Java Teratas. Bahagian 1 50 Soalan dan Jawapan Temuduga Teras Java Teratas.  Bahagian 2 - 1

Koleksi

25. Apakah yang dimaksudkan dengan Koleksi di Jawa?

Koleksi ialah rangka kerja yang direka untuk menyimpan dan memanipulasi objek. Digunakan untuk melakukan operasi berikut:
  • carian;
  • menyusun;
  • manipulasi;
  • penambahan;
  • pemadaman.
Semua kelas dan antara muka untuk rangka kerja Koleksi ada dalam java.utilpakej.

26. Apakah kelas dan antara muka yang tersedia dalam rangka kerja Koleksi?

Antara muka:
  • Koleksi;
  • Senarai;
  • Set;
  • Peta;
  • Set Diisih;
  • Peta Isih;
  • Beratur.
Kelas:
  • Senarai:
    1. ArrayList;
    2. LinkedList;
    3. Vektor(ditamatkan).
  • Set:
    1. HashSet;
    2. LinkedHashSet;
    3. TreeSet.
  • Peta:
    1. HashMap
    2. Peta Pokok
    3. HashTable (ditamatkan)
    4. LinkedHashMap
  • Beratur
    1. Barisan Keutamaan.

27. Apakah yang dimaksudkan dengan disusun dan dipesan dalam koleksi?

Mengarahkan:

Ini bermakna item yang disimpan dalam koleksi adalah berdasarkan nilai yang ditambahkan pada koleksi. Dengan cara ini kita boleh mengulangi nilai daripada koleksi dalam susunan tertentu. Dalam erti kata lain, ini bermakna unsur-unsur koleksi mempunyai susunan khusus mereka sendiri mengikut susunannya. Untuk pemahaman yang lebih baik, koleksi yang tidak dipesan menyimpan elemennya dalam susunan rawak. Contohnya, Set.

Diisih:

Ini bermakna sekumpulan elemen diisih ke dalam koleksi berdasarkan data elemen koleksi. Iaitu, bukan sahaja koleksi dipesan, tetapi juga susunan elemen bergantung pada nilainya. Pesanan ini mungkin berubah jika anda mengisih mengikut nilai elemen yang berbeza.

28. Apakah koleksi yang ada dengan antara muka Senarai? Bagaimanakah anda bekerja dengan Senarai?

Nilai elemen dalam helaian adalah berdasarkan indeksnya—ia disusun mengikut indeks. Pengulangan elemen dibenarkan (iaitu, anda boleh menambah objek yang sama pada koleksi beberapa kali dan ia akan baik).

ArrayList:

Koleksi yang paling biasa. Pada asasnya, ia adalah tatasusunan dengan saiz yang berkembang secara dinamik. Tugas menguruskan saiz tatasusunan terletak pada koleksi. Adalah penting untuk kita memahami bahawa dalam kebanyakan kes inilah yang perlu kita gunakan. Keanehan:
  • carian pantas dan carian indeks pantas;
  • koleksi dipesan mengikut indeks, tetapi tidak diisih;
  • melaksanakan antara muka RandomAccess;
  • perlahan-lahan menambah bahagian tengah senarai.
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]
Output menunjukkan bahawa ini adalah elemen yang boleh diulang. Ia dipaparkan mengikut susunan di mana ia direkodkan. Apa lagi yang perlu dibaca? Ya, terdapat banyak maklumat, anda tidak perlu meninggalkan JavaRush:

Senarai Terpaut:

Ini ialah koleksi di mana setiap elemen mempunyai pautan ke elemen sebelumnya dan seterusnya. Pautan ini membolehkan anda berpindah dari satu elemen ke elemen yang lain. Apabila menambah elemen, pautan ke elemen sebelumnya dan seterusnya hanya berubah: 50 Soalan dan Jawapan Temuduga Teras Java Teratas.  Bahagian 2 - 2
  • elemen disambungkan antara satu sama lain, iaitu, senarai berganda dilaksanakan;
  • kelajuan keseluruhan operasi adalah lebih rendah daripada dalam ArrayList;
  • pilihan yang sangat baik untuk sejumlah besar sisipan dan pemadaman ke tengah tatasusunan;
  • melaksanakan antara muka senarai Queue dan Deque, dan oleh itu mempunyai kaedah mereka untuk berfungsi.
Contoh:
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("One");
linkedList.add("Two");
linkedList.add("Three");

29. Beritahu kami tentang koleksi Peta dan pelaksanaannya?

Peta ialah koleksi nilai kunci. Terdapat kunci unik dan nilai yang sepadan dengan nilai tersebut. equals()Kaedah juga digunakan hashcode()untuk menentukan keunikan sesuatu kunci.

HashMap:

  • tidak disusun atau diperintahkan;
  • digunakan jika susunan dan pengisihan tidak penting;
  • menyokong kunci null.
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 sentiasa unik, jadi hanya seorang senior direkodkan.

LinkedHashMap:

  • mengekalkan susunan sisipan;
  • lebih perlahan daripada HashMap;
  • lelaran dijangka lebih pantas daripada dalam 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 Pokok:

Pelaksanaan peta yang memastikan entri diisih mengikut susunan semula jadi kunci mereka, atau lebih baik lagi, menggunakan pembanding jika satu disediakan dalam pembina apabila 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}
Kami melihat bahawa pengisihan dalam tertib menaik dilaksanakan sebagai standard, tetapi ini boleh diubah dengan menambah pembanding kepada pembina. TreeMap diterangkan dengan baik di sini .

30. Beritahu kami tentang koleksi Set dan pelaksanaannya?

Set ialah satu set elemen unik, dan ini adalah ciri utamanya. Iaitu, Set tidak membenarkan elemen yang sama diulang. Adalah penting di sini bahawa objek yang ditambahkan mempunyai kaedah yang dilaksanakan equals .

HashSet:

  • tidak disusun atau diperintahkan. Di bawah tudung terdapat HashMap dengan pemegang tempat untuk nilai. Lihatlah sendiri ;)
  • menggunakan hashCode untuk menambah objek;
  • Ia harus digunakan apabila anda perlu mempunyai objek unik dan susunannya 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 boleh melihat bahawa elemen "junior", yang telah ditambah dua kali, hanya terdapat dalam satu contoh. Dan susunannya tidak sama seperti semasa menambah.

LinkedHashSet:

  • versi pesanan HashSet;
  • menyokong senarai berganda untuk semua elemen;
  • Gunakannya apabila anda memerlukan pesanan dalam lelaran 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]

TreeSet:

  • satu daripada dua koleksi yang disusun;
  • menggunakan struktur pokok merah-hitam dan memastikan unsur berada dalam tertib menaik;
  • Di bawah tudung ia adalah TreeMap dengan stub pada nilai. Dan unsur-unsur TreeSet adalah kunci kepada 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. Apakah Pengecualian?

Pengecualian ialah masalah yang boleh berlaku semasa runtime. Ini adalah situasi luar biasa yang timbul atas sebab tertentu. Gambar rajah warisan pengecualian kelihatan seperti ini (anda perlu mengetahuinya dengan hati ;)): 50 Soalan dan Jawapan Temuduga Teras Java Teratas.  Bahagian 2 - 3Gambar rajah menunjukkan bahawa, secara umum, semua pengecualian dibahagikan kepada dua kumpulan - pengecualian dan ralat. Ralat - JVM digunakan untuk memaparkan ralat selepas itu aplikasi tidak lagi masuk akal. Sebagai contoh, StackOverFlowError, yang mengatakan bahawa timbunan penuh dan program tidak boleh dijalankan lagi. Pengecualian - pengecualian yang dijana secara pemrograman dalam kod. Terdapat pelbagai pengecualian, disemak dan tidak disemak, tetapi perkara utama ialah ia wujud, dan ia boleh ditangkap dan aplikasi boleh terus berfungsi. Pengecualian, seterusnya, dibahagikan lagi kepada yang mewarisi daripada RuntimeException dan keturunan Exception yang lain. Terdapat maklumat yang mencukupi mengenai isu ini. Kami akan bercakap tentang pengecualian yang disemak/tidak ditanda di bawah.

32. Bagaimanakah JVM mengendalikan pengecualian?

Bagaimana ia berfungsi? Sebaik sahaja pengecualian dilemparkan ke suatu tempat, masa jalan mencipta Objek Pengecualian (ditandakan sebagai ExcObj). Ia menyimpan semua maklumat yang diperlukan untuk kerja - pengecualian itu sendiri yang dibuang dan tempat ia berlaku. Penciptaan ExcObjdan penghantaran ke masa jalan tidak lebih daripada "membuang pengecualian." ExcObjmengandungi kaedah yang boleh digunakan untuk sampai ke tempat pengecualian dilemparkan. Set kaedah ini dipanggil Call Stack. Seterusnya, sistem masa jalan mencari kaedah dalam Tindanan Panggilan yang boleh mengendalikan pengecualian kami. Jika ia menemui pengendali yang sepadan, iaitu, jenis pengecualian sepadan dengan jenis dalam pengendali, semuanya baik-baik saja. Jika ia tidak menjumpainya, maka masa jalan menyerahkan segala-galanya kepada pengendali pengecualian lalai, yang menyediakan respons dan keluar. Bagaimana ia kelihatan 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 kes kami, CallStack secara skematik akan kelihatan seperti:

randomThrower() => populateString() => main(String[] args)
Terdapat dua pilihan: satu atau satu lagi pengecualian akan dilemparkan secara rawak. Untuk IOException semuanya ok, jika ia dijana, maka hasil kerja akan menjadi: "Caught IOException". Tetapi jika terdapat pengecualian kedua yang tiada pengendali, 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. Bagaimanakah pengaturcara mengendalikan pengecualian?

Dalam soalan di atas, kata kunci tertentu telah digunakan untuk berfungsi dengan pengecualian; kini kita perlu membincangkannya dengan lebih terperinci. Apakah kata kunci?
  • cubalah
  • tangkap
  • melontar
  • melontar
  • akhirnya
Adalah penting untuk ambil perhatian bahawa tangkapan, balingan dan balingan hanya boleh digunakan dengan java.lang.Throwable. Ini tidak akan berfungsi dengan jenis lain. Sekarang kita akan membincangkan cuba, tangkap dan akhirnya.
  • try-catch-finallyialah binaan yang membolehkan anda menangkap dan mengendalikan pengecualian dengan betul.
  • try- hanya boleh ada satu masa, di situlah logiknya berlaku;
  • catch— blok yang menerima beberapa jenis pengecualian; mungkin terdapat banyak daripadanya. Sebagai contoh, blok cuba akan membuang beberapa pengecualian yang tiada kaitan antara satu sama lain;
  • finally- "akhirnya" blok ini. Ini adalah blok yang akan dilaksanakan dalam apa jua keadaan, tanpa mengira apa yang dilakukan dalam percubaan, tangkap.
Inilah rupanya:
try {
   // сюда передают тот code, который может вызвать исключение.
} catch (IOException e) {
   // первый catch блок, который принимает IOException и все его подтипы(потомки).
   // Например, нет file при чтении, выпадает FileNotFoundException, и мы уже соответствующе
   // обрабатываем это.
} catch (IllegalAccessException e) {
   // если нужно, можно добавить больше одного catch блока, в этом нет проблем.
} catch (OneException | TwoException e) {
   // можно даже объединять несколько в один блок
} catch (Throwable t) {
   // а можно сказать, что мы принимаем ВСЁ))))
} finally {
   // этот блок может быть, а может и не быть.
   // и он точно выполнится.
}
Baca huraian contoh dengan teliti dan semuanya akan jelas)

34. baling dan baling di Jawa

melontar

throwdigunakan apabila anda perlu membuat pengecualian baharu secara eksplisit. Ia digunakan untuk mencipta dan membuang pengecualian tersuai. Contohnya, pengecualian yang berkaitan dengan pengesahan. Biasanya, untuk pengesahan, mereka mewarisi daripada RuntimeException. Contoh:
// пример пробрасывания исключения
throw new RuntimeException("because I can :D");
Adalah penting bahawa pembinaan ini hanya boleh digunakan oleh sesuatu yang mewarisi daripada Throwable. Iaitu, anda tidak boleh mengatakan ini:
throw new String("How тебе такое, Илон Маск?");
Seterusnya, kerja benang ditamatkan dan pencarian bermula untuk pengendali yang boleh memprosesnya. Apabila ia tidak menjumpainya, ia pergi ke kaedah yang memanggilnya, dan oleh itu carian akan meningkatkan baris panggilan sehingga ia sama ada menemui pengendali yang sepadan atau membiarkan aplikasi 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 kami menjalankan program, kami mendapat hasil berikut:

Doing something
IOException was successfully handled.

melontar

throws- mekanisme di mana kaedah boleh membuang satu atau lebih pengecualian. Ia ditambah dipisahkan dengan koma. Mari lihat betapa mudah dan ringkasnya:
private Object willThrow() throws RuntimeException, IOException, FileNotFoundException
Selain itu, adalah penting untuk ambil perhatian bahawa terdapat pengecualian yang disemak dan tidak disemak. Sudah tentu, pengecualian yang tidak disemak tidak boleh ditambahkan pada throws, tetapi adab yang baik menyatakan sebaliknya. Jika ini adalah boleh semak, kemudian menggunakan kaedah yang menjananya, anda perlu memprosesnya. Terdapat dua pilihan:
  1. Tulis try-catchdengan pengecualian warisan yang sesuai dan di atas.
  2. Gunakannya throwsdengan cara yang sama supaya orang lain sudah mempunyai masalah ini :D

35. Pengecualian yang Ditanda dan Tidak Ditanda di Jawa

Terdapat dua jenis pengecualian dalam Java - ditanda dan tidak ditanda.

Pengecualian yang diperiksa:

Ini adalah pengecualian yang disemak pada masa penyusunan. Jika sesetengah kod dalam kaedah melemparkan pengecualian yang diperiksa semasa pengecualian, kaedah itu mesti sama ada memprosesnya menggunakan try-catch, atau memajukannya lagi. Contohnya, yang membaca imej daripada laluan "/users/romankh3/image.png", mengemas kininya dalam beberapa cara (bagi kami ini tidak penting) dan simpan semula.
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);
   }
}
Kod sedemikian tidak akan disusun, kerana kaedah statik ImageIO.read()membuang ImageIO.write()IOException, yang diperiksa dan mesti dikendalikan dengan sewajarnya. Terdapat dua pilihan di sini yang telah kita bincangkan di atas: sama ada gunakan try-catch, atau ke hadapan lebih jauh. Untuk asimilasi yang lebih baik, kami akan melakukan ini dan itu. Iaitu, updateAndSavekami hanya akan memajukannya dalam kaedah, dan kemudian menggunakannya dalam kaedah 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 tidak ditandai:

Ini adalah pengecualian yang tidak disemak pada peringkat penyusunan. Iaitu, kaedah boleh menjana RuntimeException, tetapi pengkompil tidak akan mengingatkan anda untuk mengendalikannya. Seperti yang ditunjukkan di bawah, kami mempunyai semua yang diwarisi daripada RuntimeException dan Ralat tidak ditandakan. 50 Soalan dan Jawapan Temuduga Teras Java Teratas.  Bahagian 2 - 4Pertimbangkan program Java berikut. Kod disusun dengan baik, tetapi membuang pengecualian apabila dijalankan ArrayIndexOutOfBoundsException. Pengkompil membenarkannya untuk menyusun kerana ArrayIndexOutOfBoundsExceptionia adalah pengecualian yang tidak ditanda. Situasi biasa dengan tatasusunan, yang boleh:
class CheckedImageExample {
   public static void main(String[] args) {
       int[] array = new int[3];
       array[5] = 12;
   }
}
Hasilnya akan menjadi:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
  at main(CheckedImageExample.java:12)
By the way, adakah anda sudah perasan bahawa di Jawa tiada siapa yang memberikan nama pendek? Lebih besar lebih bagus. Dia, Spring Framework, sangat berjaya dalam hal ini: hanya ambil beberapa kelas BeanFactoryPostProcessor )))

36. Apakah itu cuba-dengan-sumber?

Ini adalah mekanisme di mana semua sumber mesti ditutup dengan betul. Ia entah bagaimana tidak jelas, bukan?) Pertama sekali, apa itu sumber... Sumber ialah objek, selepas bekerja dengannya anda perlu menutupnya, iaitu, panggil close(). Sumber merujuk kepada semua objek yang melaksanakan antara muka AutoClosable, yang seterusnya melaksanakan antara muka Closeable. Adalah penting untuk kita memahami bahawa segala-galanya InputStreamadalah OutpuStreamsumber dan perlu dikeluarkan dengan betul dan berjaya. Inilah sebabnya mengapa kita perlu menggunakan try-with-resourcestruktur. Inilah rupanya:
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, sumbernya ialah ZipInputStream, selepas bekerja dengannya anda perlu menutupnya. Dan untuk tidak berfikir tentang memanggil kaedah close(), kami hanya menentukan pembolehubah ini dalam blok cuba, seperti yang ditunjukkan dalam contoh, dan dalam blok ini kami melakukan semua yang diperlukan. Apakah yang dilakukan oleh contoh? Ia akan membuka zip arkib. Untuk melakukan ini, anda perlu menggunakan InputStream'om. Anda boleh mentakrifkan lebih daripada satu pembolehubah; ia dipisahkan oleh koma bertitik. Apa masalahnya? Tetapi anda boleh menggunakan finallyblok, anda mungkin berkata. Berikut ialah artikel yang memperincikan masalah dengan pendekatan ini. Ia juga menerangkan keseluruhan senarai kegagalan yang boleh menimpa seseorang yang mengabaikan menggunakan reka bentuk ini. Saya syorkan membacanya ;) Di bahagian akhir terdapat soalan/jawapan mengenai topik Multithreading. Profil GitHub saya
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION