logo

Неизменен списък в Java

В Java неизменният списък е списък, който не може да бъде модифициран, след като бъде създаден. Опитът за добавяне, премахване или модифициране на елементи в списъка след създаването му ще предизвика изключение.

Основната полза от използването на неизменни списъци е, че те осигуряват безопасност на нишката и правят кода по-стабилен. Тъй като списъкът не може да бъде модифициран, след като е създаден, няма риск няколко нишки да се опитват да го модифицират едновременно и да причинят проблеми. Освен това, неизменните списъци могат лесно да се споделят между различни програмни части, без да се страхувате, че ще бъдат неволно модифицирани.

функции на java 8

Като цяло използването на неизменни списъци в Java може да подобри безопасността и устойчивостта на дадена програма, особено в многонишкови среди, където споделените структури от данни могат да причинят проблеми.

Декларация на класа

В Java, Неизменен списък клас е част от Гуава библиотека, която предоставя няколко неизменни класа за колекция. Да използвам Неизменен списък , първо импортираме com.google.common.collect пакетът, съдържащ Неизменен списък клас.

Декларацията на класа на Неизменен списък е както следва:

 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. Импортирайте необходимите класове: Импортирайте интерфейса List и класа 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); } } 

Изход:

 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, който се хвърля при опит за промяна на списъка.

низ към json обект

Стъпките за намиране на решението са посочени по-долу:

  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

ImutableList има няколко предимства, включително:

    Безопасност на нишките:Тъй като ImmutableList е неизменен, той по своята същност е безопасен за нишки. Множество нишки могат да имат достъп до един и същи списък без никакъв риск от намеса в нишката или несъответствие в паметта.Сигурност:Неизменните списъци са по-малко податливи на уязвимости в сигурността. Например, ако нападател се опита да промени списъка чрез добавяне или премахване на елементи, той не може да го направи, тъй като списъкът е неизменен.Производителност:Тъй като неизменните списъци са само за четене, те могат да бъдат кеширани за по-добра производителност. Ако един списък трябва да бъде достъпен многократно, използването на неизменен списък вместо създаване на нов списък всеки път може да помогне за избягване на допълнителни разходи.Предсказуемост:Тъй като неизменните списъци не могат да бъдат модифицирани, тяхното поведение е предвидимо. Някои предимства от използването на неизменни списъци елиминират необходимостта от защитно програмиране и улесняват разсъжденията относно кода.Опростява кодирането:Неизменните списъци опростяват кодирането, като елиминират необходимостта от синхронизация, защитно копиране и податливо на грешки ръчно управление на паметта. Резултатът от този подход е код, който е по-лесен за поддръжка и има по-чист вид.Улеснява тестването:Неизменните списъци са по-лесни за тестване, тъй като тяхното съдържание не се променя. Подходът улеснява писането на тестове, които покриват всички възможни сценарии и крайни случаи.