logo

Непроменљива листа у Јави

У Јави, непроменљива листа је листа која се не може мењати када је креирана. Покушај додавања, уклањања или измене елемената на Листи након њеног креирања ће изазвати изузетак.

Примарна предност коришћења непроменљивих листа је та што оне пружају сигурност нити и чине код робуснијим. Пошто се листа не може мењати након што је креирана, не постоји ризик да више нити покуша да је модификује истовремено и да изазове проблеме. Поред тога, непроменљиве листе могу се лако делити међу различитим деловима програма без страха да ће бити ненамерно измењене.

Све у свему, коришћење непроменљивих листа у Јави може побољшати безбедност и робусност програма, посебно у окружењима са више нити где дељене структуре података могу изазвати проблеме.

Цласс Децларатион

У Јави, тхе ИммутаблеЛист класа је део Гуава библиотека, која пружа неколико непроменљивих класа збирке. Користити ИммутаблеЛист , прво увозимо цом.гоогле.цоммон.цоллецт пакет који садржи ИммутаблеЛист класа.

арраилист јава

Декларација класе ИммутаблеЛист је као што следи:

 public abstract class ImmutableList extends ImmutableCollection implements List 

ИммутаблеЛист проширује ИммутаблеЦоллецтион класе и спроводи Листа интерфејс. То је генеричка класа, што значи да можемо креирати ИммутаблеЛист било које врсте података. Тхе И у декларацији представља параметар типа, који можемо заменити било којим именом класе или интерфејса.

Хијерархија класа

Тхе ИммутаблеЛист класа спроводи Листа интерфејс и представља листу која се не може мењати након креирања.

Хијерархија класа на ИммутаблеЛист је као што следи:

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

овде, ИммутаблеЦоллецтион је апстрактна класа која обезбеђује скелетну имплементацију ИммутаблеЦоллецтион интерфејс, који ИммутаблеЛист протеже.

Све у свему, ИммутаблеЛист цласс пружа згодан и ефикасан начин за креирање и коришћење непроменљивих листа у Јави.

Креирање ИммутаблеЛист

Постоје различити начини за креирање ИммутаблеЛист у Јави, у зависности од верзије Јаве коју користите и библиотека које имате на располагању. Ево неколико примера:

1. Коришћење методе Јава 9 оф():

Јава 9 увела је нови метод назван оф() у интерфејсу листе, који ствара непроменљиве листе концизније и читљивије. Метод оф() је фабрички метод који узима променљив број аргумената и враћа непроменљиву листу која садржи те елементе. Може се користити са било којом класом која имплементира интерфејс листе, укључујући АрраиЛист, ЛинкедЛист и ИммутаблеЛист. Једна од предности коришћења оф() методе је та што је много сажетији и пружа сигурност у време компајлирања извођењем закључивања типа на аргументима, осигуравајући да се на листу додају само објекти исправног типа. Све у свему, метода оф() поједностављује креирање непроменљивих листа у Јави.

Кораци за проналажење решења су наведени у наставку.

  1. Увезите класу Лист из пакета Јава.утил: што омогућава програму да користи интерфејс листе за креирање и манипулацију листама објеката.
  2. Креирајте непроменљиву листу користећи Јава 9 фабричку методу: Код користи метод Лист.оф() да креира непроменљиву листу стрингова са четири елемента.
  3. Покушај измене листе: Програм покушава да дода елемент у непроменљиву листу користећи адд() метод, што није дозвољено на непроменљивим листама. Као резултат тога, програм хвата изузетак УнсуппортедОператионЕкцептион који је избацила метода адд() и штампа поруку која указује да се листа не може мењати.

Назив документа: ИммутаблеЛистЕкампле.јава

 // 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. Коришћење класе ИммутаблеЛист.Буилдер из библиотеке Гуава:

Додавање елемената на Листу у течном стилу, што га чини погодним за постепено креирање листе.

Без обзира на метод који се користи, резултујућој ИммутаблеЛист се може приступити и понављати је као било којој другој листи, али њен садржај се не може мењати.

Ево поступног решења за дати код:

формат стринга у Јави
  1. Увезите потребне класе: Увезите интерфејс листе и класу ИммутаблеЛист из пакета цом.гоогле.цоммон.цоллецт.
  2. Креирајте непроменљиву листу помоћу градитеља: Креирајте непроменљиву листу помоћу градитеља ИммутаблеЛист. Користите метод адд() да додате елементе на Листу и позовите метод буилд() да креирате непроменљиву листу.
  3. Креирајте непроменљиву листу из постојеће листе: Креирајте објекат Лист са жељеним елементима. Затим позовите метод ИммутаблеЛист.цопиОф(), прослеђујући Листу као параметар, да бисте креирали непроменљиву листу.
  4. Додавање више елемената: Користите градитељ ИммутаблеЛист да бисте додали још елемената помоћу методе аддАлл() и позовите метод буилд() да бисте креирали непроменљиву листу.
  5. Штампајте листе: Користите методу Систем.оут.принтлн() да бисте одштампали садржај непроменљивих листа.

Имплементација:

Назив документа: ИммутаблеЛистЕкампле.јава

 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. Коришћењем оф() методе класе ИммутаблеЛист

Метод оф() класе ИммутаблеЛист у библиотеци Гуава вам омогућава да креирате непроменљиву листу са фиксним бројем елемената. Када се листа креира, не можете додавати, уклањати или мењати њене елементе.

Назив документа: ИммутаблеЛистЕкампле.јава

цсс центрирање слике
 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. Коришћењем методе цопиОф().

У Јави метод цопиОф() креира нови низ који копира постојећи низ одређене дужине. Метод узима два аргумента: низ који треба копирати и дужину новог низа.

Назив документа: ИммутаблеЛистЕкампле.јава

 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. УнсуппортедОператионЕкцептион

Програм илуструје креирање непроменљиве листе у Јави помоћу методе Цоллецтионс.унмодифиаблеЛист. Поред тога, показује како се поступа са изузетком УнсуппортедОператионЕкцептион који се јавља када покушавате да измените листу.

Кораци за проналажење решења су наведени у наставку:

  1. Прво, креирамо променљиво Низ листа који садржи неке почетне елементе користећи оф метод, који враћа непроменљиву листу. Онда ћемо ово проћи Низ листа до Цоллецтионс.унмодифиаблеЛист метод, који враћа непроменљиви приказ листе.
  2. Покушавамо да изменимо непроменљиву листу користећи додати, уклонити , и комплет Пошто је листа непроменљива, покушај да је модификујете ће изазвати појаву УнсуппортедОператионЕкцептион .
  3. Хватамо УнсуппортедОператионЕкцептион који се баца и одштампа поруку на конзоли која показује која је операција покушана и неуспешна.

Имајте на уму да је Цоллецтионс.унмодифиаблеЛист метода само ствара непроменљиви приказ оригиналне листе. Непроменљиви приказ ће одражавати те промене ако се оригинална листа измени. Да бисте креирали заиста непроменљиву листу која се не може мењати ни на који начин, можете користити прилагођену имплементацију Листа интерфејс који баца изузетак када покушава да измени листу.

гимп уклонити водени жиг

Имплементација:

Назив документа: ИммутаблеЛистЕкампле.јава

 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. Цоллецтионс.унмодифиаблеЛист()

Цоллецтионс.унмодифиаблеЛист() је метод у оквиру Јава Цоллецтионс Фрамеворк-а који креира неизмењени приказ постојеће листе. Може се закључити да ће покушај измене листе која се не може мењати довести до појаве УнсуппортедОператионЕкцептион. Оригинална листа се и даље може мењати, а све промене ће се одразити на листу која се не може мењати.

Програм показује како да се користи метод Цоллецтионс.унмодифиаблеЛист() за генерисање непроменљивог приказа променљиве листе.

Кораци за проналажење решења су наведени у наставку:

  1. Направите променљиву листу мутаблеЛист и додајте му неке елементе користећи додати() методом Низ листа
  2. Направите непроменљиви приказ променљиве листе мутаблеЛист помоћу унмодифиаблеЛист() метод и додели га променљивој унмодифиаблеЛист .
  3. Покушајте да измените листу која се не може мењати унмодифиаблеЛист помоћу додати() Пошто је листа која се не може мењати само за читање, ово ће избацити УнсуппортедОператионЕкцептион . Порука се штампа на конзоли након хватања овог изузетка.
  4. Измените оригиналну променљиву листу мутаблеЛист додавањем другог елемента помоћу додати()
  5. Одштампајте и променљиву и непроменљиву листу на конзоли да бисте показали да листа која се не може мењати одражава промене направљене на оригиналној променљивој листи.

Назив документа: УнмодифиаблеЛистЕкампле.јава

 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] 

Предности ИммутаблеЛист

ИммутаблеЛист има неколико предности, укључујући:

    Безбедност нити:Пошто је ИммутаблеЛист непроменљив, он је инхерентно сигуран нити. Више нити може приступити истој Листи без икаквог ризика од интерференције нити или недоследности меморије.безбедност:Непроменљиве листе су мање склоне безбедносним рањивостима. На пример, ако нападач покуша да измени листу додавањем или уклањањем елемената, не може то да уради јер је листа непроменљива.Перформансе:Пошто су непроменљиве листе само за читање, могу се кеширати ради бољих перформанси. Ако листи треба да се приступи више пута, коришћење непроменљиве листе уместо сваког прављења нове листе може помоћи да се избегну прекомерна оптерећења.Предвидљивост:Пошто се непроменљиве листе не могу мењати, њихово понашање је предвидљиво. Неке предности коришћења непроменљивих листа елиминишу потребу за одбрамбеним програмирањем и олакшавају размишљање о коду.Поједностављује кодирање:Непроменљиве листе поједностављују кодирање елиминишући потребу за синхронизацијом, одбрамбеним копирањем и ручним управљањем меморијом склоном грешкама. Резултат оваквог приступа је код који се лакше одржава и има чистији изглед.Олакшава тестирање:Непроменљиве листе је лакше тестирати јер се њихов садржај не мења. Овај приступ олакшава писање тестова који покривају све могуће сценарије и рубне случајеве.