logo

Незмінний список у Java

У Java незмінний список — це список, який не можна змінювати після створення. Спроба додати, видалити чи змінити елементи в списку після його створення призведе до виключення.

Основна перевага використання незмінних списків полягає в тому, що вони забезпечують безпеку потоків і роблять код більш надійним. Оскільки список не можна змінювати після його створення, немає ризику, що кілька потоків намагатимуться змінити його одночасно та спричинять проблеми. Крім того, незмінні списки можна легко поділити між різними частинами програми, не боячись бути ненавмисно зміненими.

Загалом використання незмінних списків у Java може покращити безпеку та надійність програми, особливо в багатопоточних середовищах, де спільні структури даних можуть спричинити проблеми.

Оголошення класу

У Java, Незмінний список клас є частиною Гуава бібліотека, яка надає кілька незмінних класів колекції. Використовувати Незмінний список , ми спочатку імпортуємо com.google.common.collect пакет, що містить Незмінний список клас.

Оголошення класу Незмінний список полягає в наступному:

java math.random
 public abstract class ImmutableList extends ImmutableCollection implements List 

Незмінний список розширює ImmutableCollection клас і реалізує Список інтерфейс. Це загальний клас, що означає, що ми можемо створити Незмінний список будь-якого типу даних. The І в декларації представляє параметр типу, який ми можемо замінити на будь-яке ім’я класу чи інтерфейсу.

Ієрархія класів

The Незмінний список клас реалізує Список інтерфейс і представляє список, який не можна змінити після створення.

Класова ієрархія Незмінний список полягає в наступному:

 java.lang.Object com.google.common.collect.ImmutableCollection com.google.common.collect.ImmutableList 

тут, ImmutableCollection це абстрактний клас, який забезпечує скелетну реалізацію ImmutableCollection інтерфейс, який Незмінний список поширюється.

Загалом, Незмінний список Клас забезпечує зручний і ефективний спосіб створення та використання незмінних списків у Java.

Створення ImmutableList

Існують різні способи створення ImmutableList у Java, залежно від версії Java, яку ви використовуєте, і доступних бібліотек. Ось кілька прикладів:

1. Використовуючи метод Java 9 of():

Java 9 представила новий метод під назвою of() в інтерфейсі List, який створює незмінні списки більш стисло та зрозуміло. Метод of() — це фабричний метод, який приймає змінну кількість аргументів і повертає незмінний список, що містить ці елементи. Його можна використовувати з будь-яким класом, який реалізує інтерфейс List, включаючи ArrayList, LinkedList і ImmutableList. Однією з переваг використання методу of() є те, що він є набагато лаконічнішим і забезпечує безпеку під час компіляції, виконуючи висновок про тип аргументів, гарантуючи додавання до списку лише об’єктів правильного типу. Загалом, метод of() спрощує створення незмінних списків у Java.

Нижче наведено кроки для пошуку рішення.

  1. Імпортуйте клас List із пакета Java.util: це дозволяє програмі використовувати інтерфейс List для створення списків об’єктів і керування ними.
  2. Створіть незмінний список за допомогою фабричного методу Java 9: ​​код використовує метод List.of() для створення незмінного списку рядків із чотирма елементами.
  3. Спроба змінити список: програма намагається додати елемент до незмінного списку за допомогою методу add(), який не дозволяється для незмінних списків. У результаті програма перехоплює виключення UnsupportedOperationException, викликане методом add(), і друкує повідомлення про те, що список не можна змінити.

Ім'я файлу: ImmutableListExample.java

 // Import the required List class from the Java.util package import java.util.List; // Define the class name public class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using the Java 9 factory of() method List fruits = List.of('apple', 'banana', 'orange', 'grape'); // Print the elements of the List System.out.println('Fruits: ' + fruits); // Try to modify the List (will throw UnsupportedOperationException) try { fruits.add('pineapple'); } catch (UnsupportedOperationException ex) { System.out.println('Cannot modify immutable list.'); } } } 

Вихід:

 Fruits: [apple, banana, orange, grape] Cannot modify immutable List. 

2. Використання класу ImmutableList.Builder з бібліотеки Guava:

Додавання елементів до списку в вільному стилі, що робить його зручним для поступового створення списку.

Незалежно від використовуваного методу, до отриманого ImmutableList можна отримати доступ і повторити його, як і будь-який інший список, але його вміст не можна змінити.

Ось поетапне рішення для даного коду:

  1. Імпортуйте необхідні класи: імпортуйте інтерфейс списку та клас ImmutableList із пакета com.google.common.collect.
  2. Створіть незмінний список за допомогою конструктора: створіть незмінний список за допомогою конструктора ImmutableList. Використовуйте метод add(), щоб додати елементи до списку, і викликайте метод build(), щоб створити незмінний список.
  3. Створіть незмінний список із наявного списку: створіть об’єкт List із потрібними елементами. Потім викличте метод ImmutableList.copyOf(), передавши List як параметр, щоб створити незмінний список.
  4. Додавання додаткових елементів: скористайтеся конструктором ImmutableList, щоб додати додаткові елементи за допомогою методу addAll() і викликайте метод build(), щоб створити незмінний список.
  5. Друк списків: використовуйте метод System.out.println(), щоб надрукувати вміст незмінних списків.

Реалізація:

Ім'я файлу: ImmutableListExample.java

 import java.util.List; import com.google.common.collect.ImmutableList; public class ImmutableListExample { public static void main(String[] args) { // Creating an immutable list using the builder ImmutableList immutableList1 = ImmutableListbuilder() .add('Welcome') .add('to') .add('home') .build(); // Creating an immutable list from an existing list List existingList = List.of('Welcome', 'to', 'home', 'Think'); ImmutableList immutableList2 = ImmutableList.copyOf(existingList); // Creating an immutable list from an existing list and adding more elements ImmutableList immutableList3 = ImmutableList.builder() .addAll(existingList) .add('Big') .build(); // Let's print the lists System.out.println('Immutable List 1: ' + immutableList1); System.out.println('Immutable List 2: ' + immutableList2); System.out.println('Immutable List 3: ' + immutableList3); } } 

Вихід:

15 із 100,00
 Immutable List 1: [Welcome, to, home] Immutable List 2: [Welcome, to, home, Think] Immutable List 3: [Welcome, to, home, Think, Big] 

3. За допомогою методу of() класу ImmutableList

Метод of() класу ImmutableList у бібліотеці Guava дозволяє створити незмінний список із фіксованою кількістю елементів. Після створення списку ви не можете додавати, видаляти або змінювати його елементи.

Ім'я файлу: ImmutableListExample.java

 import com.google.common.collect.ImmutableList; import java.util.List; class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using the Guava library's ImmutableList class ImmutableList fruits = ImmutableList.of('apple', 'banana', 'orange', 'grape'); // Print the contents of the immutable List System.out.println('Fruits: ' + fruits); } } 

Вихід:

 Fruits: [apple, banana, orange, grape] 

4. За допомогою методу copyOf().

У Java метод copyOf() створює новий масив, який копіює існуючий масив заданої довжини. Метод приймає два аргументи: масив, який потрібно скопіювати, і довжину нового масиву.

Ім'я файлу: ImmutableListExample.java

 import com.google.common.collect.ImmutableList; import java.util.*; class ImmutableListExample { public static void main(String[] args) { // Create an ArrayList and add elements to it List myArrayList = new ArrayList(); myArrayList.add('Java'); myArrayList.add('Python'); myArrayList.add('C++'); // Create an immutable list using the Guava library's ImmutableList class and the copyOf() method ImmutableList immutableList1 = ImmutableList.copyOf(myArrayList); // Create an array and convert it to a list String[] myArray = {'Learning', 'Web', 'Development', 'is', 'Fun'}; List myList = Arrays.asList(myArray); // Create an immutable list using the Guava library's ImmutableList class and the copyOf() method ImmutableList immutableList2 = ImmutableList.copyOf(myList); // Print the contents of the immutable lists System.out.println('Immutable List 1: ' + immutableList1); System.out.println('Immutable List 2: ' + immutableList2); } } 

Вихід:

 Immutable List 1: [Java, Python, C++] Immutable List 2: [Learning, Web, Development, is, Fun] 

5. UnsupportedOperationException

Програма ілюструє створення незмінного списку в Java за допомогою методу Collections.unmodifiableList. Крім того, тут показано, як обробляти виключення UnsupportedOperationException, яке виникає під час спроби змінити список.

Нижче наведено кроки для пошуку рішення:

  1. Спочатку ми створюємо змінний ArrayList містить деякі початкові елементи за допомогою з метод, який повертає незмінний список. Потім ми передаємо це ArrayList до Collections.unmodifiableList метод, який повертає незмінний вигляд списку.
  2. Ми намагаємося змінити незмінний список за допомогою додати, видалити , і встановити Оскільки список є незмінним, спроба змінити його призведе до появи UnsupportedOperationException .
  3. Ми ловимо UnsupportedOperationException який викидається, і виводить повідомлення на консоль із зазначенням того, яка операція була спроба та була невдалою.

Зверніть увагу, що Collections.unmodifiableList метод створює лише незмінне подання вихідного списку. Незмінне подання відображатиме ці зміни, якщо вихідний список буде змінено. Щоб створити справді незмінний список, який не можна змінювати будь-якими засобами, ви можете використати спеціальну реалізацію Список інтерфейс, який створює виняток під час спроби змінити список.

Реалізація:

Ім'я файлу: ImmutableListExample.java

 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ImmutableListExample { public static void main(String[] args) { // Create an immutable list using Collections.unmodifiableList List immutableList = Collections.unmodifiableList(new ArrayList(List.of('foo', 'bar', 'baz'))); // Attempt to modify the immutable List using various methods try { immutableList.add('qux'); System.out.println('Successfully added element to immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } try { immutableList.remove(0); System.out.println('Successfully removed element from immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } try { immutableList.set(0, 'qux'); System.out.println('Successfully modified element in immutable list!'); } catch (UnsupportedOperationException e) { System.out.println('UnsupportedOperationException: ' + e.getMessage()); } } } 

Вихід:

 UnsupportedOperationException: null UnsupportedOperationException: null UnsupportedOperationException: null 

6. Collections.unmodifiableList()

Collections.unmodifiableList() це метод у Java Collections Framework, який створює незмінний вигляд існуючого списку. Можна зробити висновок, що спроба змінити список, який не можна змінювати, призведе до виникнення винятку UnsupportedOperationException. Оригінальний список все ще можна змінювати, і будь-які зміни відображатимуться в списку, який не можна змінювати.

Програма демонструє, як використовувати метод Collections.unmodifiableList() для створення незмінюваного представлення змінного списку.

Нижче наведено кроки для пошуку рішення:

  1. Створіть змінний список mutableList і додайте до нього деякі елементи за допомогою додати() метод ArrayList
  2. Створіть незмінний вигляд змінного списку mutableList використовуючи unmodifiableList() і призначте його змінній unmodifiableList .
  3. Спроба змінити незмінний список unmodifiableList використовуючи додати() Оскільки незмінюваний список доступний лише для читання, це викличе UnsupportedOperationException . Після виявлення цієї виняткової ситуації на консолі друкується повідомлення.
  4. Змінити вихідний список змінних mutableList додавши інший елемент за допомогою додати()
  5. Надрукуйте на консолі як змінний, так і незмінний списки, щоб показати, що незмінний список відображає зміни, внесені до оригінального змінного списку.

Ім'я файлу: UnmodifiableListExample.java

 import java.util.ArrayList; import java.util.Collections; import java.util.List; public class UnmodifiableListExample { public static void main(String[] args) { List mutableList = new ArrayList(); mutableList.add('apple'); mutableList.add('banana'); mutableList.add('orange'); // Create an unmodifiable view of the mutableList List unmodifiableList = Collections.unmodifiableList(mutableList); // Attempt to modify the unmodifiableList will throw UnsupportedOperationException try { unmodifiableList.add('pear'); } catch (UnsupportedOperationException e) { System.out.println('Attempt to modify unmodifiableList failed: ' + e.getMessage()); } // The original mutableList can still be modified mutableList.add('pear'); // The unmodifiableList will reflect the changes made to the original mutableList System.out.println('mutableList: ' + mutableList); // [apple, banana, orange, pear] System.out.println('unmodifiableList: ' + unmodifiableList); // [apple, banana, orange, pear] } } 

Вихід:

 Attempt to modify unmodifiableList failed: null mutableList: [apple, banana, orange, pear] unmodifiableList: [apple, banana, orange, pear] 

Переваги ImmutableList

ImmutableList має кілька переваг, зокрема:

порівняти з java
    Безпека потоків:Оскільки ImmutableList незмінний, він за своєю суттю є потокобезпечним. Кілька потоків можуть отримати доступ до одного списку без будь-якого ризику взаємодії потоків або невідповідності пам’яті.Безпека:Незмінні списки менш схильні до вразливості системи безпеки. Наприклад, якщо зловмисник намагається змінити список, додаючи або видаляючи елементи, він не зможе цього зробити, оскільки список є незмінним.Продуктивність:Оскільки незмінні списки доступні лише для читання, їх можна кешувати для кращої продуктивності. Якщо до списку потрібно звертатися кілька разів, використання незмінного списку замість кожного разу створювати новий список може допомогти уникнути накладних витрат.Передбачуваність:Оскільки незмінні списки не можна змінити, їх поведінка є передбачуваною. Деякі переваги використання незмінних списків усувають потребу в захисному програмуванні та полегшують міркування про код.Спрощує кодування:Незмінні списки спрощують кодування, усуваючи потребу в синхронізації, захисному копіюванні та схильному до помилок ручному управлінні пам’яттю. Результатом такого підходу є код, який легше підтримувати та має чистіший вигляд.Полегшує тестування:Незмінні списки легше тестувати, оскільки їхній вміст не змінюється. Цей підхід полегшує написання тестів, які охоплюють усі можливі сценарії та крайові випадки.