logo

Nekintamas sąrašas Java

„Java“ programoje nekintamas sąrašas yra sąrašas, kurio sukūrus negalima keisti. Bandymas pridėti, pašalinti ar modifikuoti elementus sąraše, kai jis bus sukurtas, padarys išimtį.

Pagrindinis nekintamų sąrašų naudojimo pranašumas yra tas, kad jie užtikrina gijų saugumą ir daro kodą tvirtesnį. Kadangi sąrašo negalima keisti po jo sukūrimo, nėra pavojaus, kad kelios gijos bandys jį keisti vienu metu ir sukels problemų. Be to, nekeičiami sąrašai gali būti lengvai bendrinami tarp skirtingų programos dalių, nebijant, kad jie bus netyčia pakeisti.

Apskritai, naudojant nekintamus sąrašus Java gali pagerinti programos saugumą ir patikimumą, ypač kelių gijų aplinkoje, kur bendrinamos duomenų struktūros gali sukelti problemų.

Klasės deklaracija

Java programoje Nekeičiamas sąrašas klasė yra dalis gvajava biblioteka, kurioje yra keletas nekintamų rinkinių klasių. Naudoti Nekeičiamas sąrašas , pirmiausia importuojame com.google.common.collect pakuotė, kurioje yra Nekeičiamas sąrašas klasė.

Klasės deklaracija Nekeičiamas sąrašas yra taip:

 public abstract class ImmutableList extends ImmutableCollection implements List 

Nekeičiamas sąrašas pratęsia Nekeičiama kolekcija klasę ir įgyvendina Sąrašas sąsaja. Tai bendroji klasė, o tai reiškia, kad galime sukurti Nekeičiamas sąrašas bet kokio tipo duomenų. The IR deklaracijoje reiškia tipo parametrą, kurį galime pakeisti bet kokiu klasės ar sąsajos pavadinimu.

Klasių hierarchija

The Nekeičiamas sąrašas klasė įgyvendina Sąrašas sąsaja ir yra sąrašas, kurio sukūrus keisti negalima.

vaizdas kaip fonas css

Klasės hierarchija Nekeičiamas sąrašas yra taip:

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

Čia Nekeičiama kolekcija yra abstrakti klasė, kuri suteikia skeleto įgyvendinimą Nekeičiama kolekcija sąsaja, kuri Nekeičiamas sąrašas tęsiasi.

Apskritai, Nekeičiamas sąrašas klasė suteikia patogų ir efektyvų būdą kurti ir naudoti nekintamus sąrašus Java.

ImmutableList kūrimas

Yra įvairių būdų, kaip sukurti „ImmutableList“ programoje „Java“, atsižvelgiant į naudojamą „Java“ versiją ir turimas bibliotekas. Štai keletas pavyzdžių:

1. Naudodami Java 9 of() metodą:

„Java 9“ Sąrašo sąsajoje pristatė naują metodą, vadinamą of(), kuris glausčiau ir skaitomiau sukuria nekintamus sąrašus. Metodas of() yra gamyklinis metodas, kuris paima kintamą argumentų skaičių ir grąžina nekintamą sąrašą, kuriame yra tie elementai. Jis gali būti naudojamas su bet kuria klase, kuri įgyvendina List sąsają, įskaitant ArrayList, LinkedList ir ImmutableList. Vienas iš of() metodo pranašumų yra tas, kad jis yra daug glaustesnis ir užtikrina kompiliavimo laiko saugumą, atlikdamas argumentų tipo išvadą, užtikrindamas, kad į sąrašą būtų įtraukti tik tinkamo tipo objektai. Apskritai of() metodas supaprastina nekintamų sąrašų kūrimą Java.

Veiksmai, kaip rasti sprendimą, nurodyti toliau.

  1. Importuokite klasę Sąrašas iš Java.util paketo: leidžia programai naudoti sąrašo sąsają objektų sąrašams kurti ir valdyti.
  2. Sukurkite nekeičiamą sąrašą naudodami „Java 9“ gamyklos metodą: Kodas naudoja metodą List.of(), kad sukurtų nepakeičiamą eilučių sąrašą su keturiais elementais.
  3. Bandymas modifikuoti sąrašą: programa bando įtraukti elementą į nekeičiamą sąrašą naudodama add() metodą, kuris neleidžiamas nekeičiamuose sąrašuose. Dėl to programa užfiksuoja UnsupportedOperationException, kurią išmetė add() metodas, ir išspausdina pranešimą, nurodantį, kad sąrašo keisti negalima.

Failo pavadinimas: 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.'); } } } 

Išvestis:

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

2. ImmutableList.Builder klasės naudojimas iš Guava bibliotekos:

Elementų įtraukimas į sąrašą sklandžiai, todėl patogu palaipsniui kurti sąrašą.

Nepriklausomai nuo naudojamo metodo, gautą ImmutableList galima pasiekti ir pakartoti kaip bet kurį kitą sąrašą, tačiau jo turinio keisti negalima.

Štai laipsniškas nurodyto kodo sprendimas:

  1. Importuokite reikiamas klases: importuokite sąsają List ir ImmutableList iš paketo com.google.common.collect.
  2. Sukurkite nekeičiamą sąrašą naudodami kūrimo priemonę: sukurkite nekeičiamą sąrašą naudodami ImmutableList kūrimo priemonę. Naudokite metodą add() norėdami įtraukti elementus į sąrašą, ir iškvieskite build() metodą, kad sukurtumėte nekintamą sąrašą.
  3. Sukurkite nepakeičiamą sąrašą iš esamo sąrašo: sukurkite sąrašo objektą su norimais elementais. Tada iškvieskite ImmutableList.copyOf() metodą, perduodant sąrašą kaip parametrą, kad sukurtumėte nekeičiamą sąrašą.
  4. Daugiau elementų pridėjimas: naudokite ImmutableList kūrimo priemonę, kad pridėtumėte daugiau elementų naudodami addAll() metodą, ir iškvieskite build() metodą, kad sukurtumėte nekeičiamą sąrašą.
  5. Spausdinti sąrašus: naudokite System.out.println() metodą, kad išspausdintumėte nekeičiamų sąrašų turinį.

Įgyvendinimas:

Failo pavadinimas: 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); } } 

Išvestis:

 Immutable List 1: [Welcome, to, home] Immutable List 2: [Welcome, to, home, Think] Immutable List 3: [Welcome, to, home, Think, Big] 

3. Naudojant of() ImmutableList klasės metodą

Guava bibliotekos ImmutableList klasės metodas of() leidžia sukurti nekeičiamą sąrašą su fiksuotu elementų skaičiumi. Sukūrę sąrašą, jo elementų pridėti, pašalinti ar keisti nebegalite.

Failo pavadinimas: 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); } } 

Išvestis:

 Fruits: [apple, banana, orange, grape] 

4. Naudojant copyOf() metodą

Java programoje copyOf() metodas sukuria naują masyvą, kuris nukopijuoja esamą nurodyto ilgio masyvą. Metodas turi du argumentus: kopijuotiną masyvą ir naujo masyvo ilgį.

Failo pavadinimas: 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); } } 

Išvestis:

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

5. UnsupportedOperationException

Programa iliustruoja nekeičiamo sąrašo kūrimą Java naudojant Collections.unmodifiableList metodą. Be to, jame parodyta, kaip elgtis su UnsupportedOperationException, kuri atsiranda bandant keisti sąrašą.

Veiksmai, kaip rasti sprendimą, nurodyti toliau:

  1. Pirmiausia sukuriame kintamąjį ArrayList kuriuose yra keletas pradinių elementų, naudojant apie metodas, kuris grąžina nekintamą sąrašą. Tada perduodame tai ArrayList prie Collections.unmodifiableList metodas, kuris grąžina nekintamą sąrašo vaizdą.
  2. Bandome modifikuoti nekintamą sąrašą naudodami pridėti, pašalinti , ir rinkinys Kadangi sąrašas yra nekintamas, bandant jį modifikuoti bus išmestas NepalaikomaOperationException .
  3. Sugauname NepalaikomaOperationException ir atspausdinkite pranešimą į konsolę, nurodantį, kuri operacija buvo bandyta ir buvo nesėkminga.

Atkreipkite dėmesį, kad Collections.unmodifiableList metodas sukuria tik nepakeičiamą pradinio sąrašo vaizdą. Nekeičiamas vaizdas atspindės tuos pakeitimus, jei pradinis sąrašas bus pakeistas. Norėdami sukurti tikrai nekeičiamą sąrašą, kurio jokiu būdu negalima keisti, galite naudoti tinkintą diegimą Sąrašas sąsaja, kuri pateikia išimtį, kai bando modifikuoti sąrašą.

Įgyvendinimas:

skaitytuvo nuskaitymas java

Failo pavadinimas: 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()); } } } 

Išvestis:

 UnsupportedOperationException: null UnsupportedOperationException: null UnsupportedOperationException: null 

6. Collections.unmodifiableList()

Collections.unmodifiableList() yra „Java Collections Framework“ metodas, kuris sukuria nekeičiamą esamo sąrašo vaizdą. Galima daryti išvadą, kad bandant modifikuoti nekeičiamą sąrašą atsiras UnsupportedOperationException. Pradinį sąrašą vis tiek galima keisti, o visi pakeitimai atsispindės nekeičiamame sąraše.

Programa demonstruoja, kaip naudoti metodą Collections.unmodifiableList() generuojant nekeičiamą kintamojo sąrašo atvaizdą.

Veiksmai, kaip rasti sprendimą, nurodyti toliau:

  1. Sukurkite keičiamą sąrašą mutableList ir pridėkite prie jo kai kuriuos elementus naudodami papildyti() metodas ArrayList
  2. Sukurkite nekeičiamą keičiamo sąrašo vaizdą mutableList naudojant unmodifiableList() metodą ir priskirkite jį kintamajam nemodifikuojamas sąrašas .
  3. Pabandykite pakeisti nekeičiamą sąrašą nemodifikuojamas sąrašas naudojant papildyti() Kadangi nekeičiamas sąrašas yra tik skaitomas, tai išmes an NepalaikomaOperationException . Užfiksavus šią išimtį, konsolėje išspausdinamas pranešimas.
  4. Pakeiskite pradinį keičiamų sąrašą mutableList pridėdami kitą elementą naudodami papildyti()
  5. Konsolėje išspausdinkite keičiamus ir nekeičiamus sąrašus, kad parodytumėte, jog nekeičiamas sąrašas atspindi pradinio keičiamo sąrašo pakeitimus.

Failo pavadinimas: 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] } } 

Išvestis:

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

ImmutableList privalumai

ImmutableList turi keletą privalumų, įskaitant:

    Siūlų sauga:Kadangi „ImmutableList“ yra nekintamas, jis iš prigimties yra saugus siūlams. Kelios gijos gali pasiekti tą patį sąrašą be jokios gijos trukdžių ar atminties nenuoseklumo rizikos.Saugumas:Nekeičiami sąrašai yra mažiau linkę į saugumo spragas. Pavyzdžiui, jei užpuolikas bando pakeisti sąrašą pridėdamas arba pašalindamas elementus, jis to padaryti negali, nes sąrašas yra nekintamas.Spektaklis:Kadangi nekeičiami sąrašai yra tik skaitomi, juos galima laikyti talpykloje, kad būtų geresnis našumas. Jei sąrašą reikia pasiekti kelis kartus, naudojant nekeičiamą sąrašą, o ne kiekvieną kartą kuriant naują sąrašą, galima išvengti papildomų išlaidų.Nuspėjamumas:Kadangi nekeičiamų sąrašų keisti negalima, jų elgesys yra nuspėjamas. Kai kurie nekintamų sąrašų naudojimo pranašumai pašalina gynybinio programavimo poreikį ir palengvina kodo samprotavimą.Supaprastina kodavimą:Nekintami sąrašai supaprastina kodavimą, nes nebereikia sinchronizuoti, kopijuoti ir neleisti rankiniu būdu valdyti klaidų. Šio metodo rezultatas – kodas, kurį lengviau prižiūrėti ir kuris atrodo švaresnis.Palengvina testavimą:Nekeičiamus sąrašus lengviau patikrinti, nes jų turinys nesikeičia. Šis metodas leidžia lengviau rašyti testus, apimančius visus galimus scenarijus ir kraštutinius atvejus.