Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Lista ja ArrayList Javassa | Osio
Javan Perustietorakenteet

Lista ja ArrayList Javassa

Pyyhkäise näyttääksesi valikon

Aloitetaan johdatus List-tietorakenteeseen. Alla on vuokaavio, joka havainnollistaa kokoelmien ja listojen hierarkiaa. Kaavio saattaa vaikuttaa laajalta ja monimutkaiselta, mutta käymme sen läpi vaihe vaiheelta.

Tässä osiossa tutustut erityiseen kokoelmatyyppiin, nimeltään listat. Tarkastelet tarkemmin erilaisia listatyyppejä, kuten ArrayList, LinkedList ja Stack.

Koska kaikki listat perivät List-rajapinnan, voit luoda olioita käyttämällä yläluokan rajapintaa. Palaamme tähän tarkemmin myöhemmin.

Keskitytään nyt ensimmäiseen listatyyppiin – ArrayList.

Yllä näet syntaksin ArrayList<>-olion luomiseksi. Saattaa olla osa, joka ei ole entuudestaan tuttu – generics eli yleismallityypit. Käsittelemme generics-ominaisuutta ja sen luomista myöhemmin.

Muista tässä vaiheessa, että kun luot ArrayList-olion, määrittelet tietotyypin kulmasulkeiden sisään. Huomioi myös, että listat eivät voi käyttää primitiivisiä tietotyyppejä. Sen sijaan käytetään wrapper-luokkia.

Seuraavaksi luodaan lista koodissa ja lisätään siihen muutamia olioita add()-metodilla.

Main.java

Main.java

1234567891011121314
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numberList = new ArrayList<>(); numberList.add(10); numberList.add(15); numberList.add(5); System.out.println(numberList); } }

Kuten huomaat, add()-metodi on hyvin yksinkertainen—se lisää annetun arvon listaan.

Muista myös, että sinun täytyy importoida List ja ArrayList java.util-kirjastosta. Jos kuitenkin käytät IntelliJ IDEA:ta, se tuo nämä kirjastot automaattisesti, joten sinun ei tarvitse huolehtia siitä.

Seuraavaksi tarkastellaan esimerkkiä listan luomisesta omalla tietotyypillämme:

Main.java

Main.java

1234567891011121314151617181920212223242526272829303132333435
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); List<Dog> dogList = new ArrayList<>(); dogList.add(bob); dogList.add(ben); dogList.add(brian); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

Kuten näet, loimme oman Dog-luokan ja ArrayList-kokoelman käyttäen tätä tietotyyppiä. Kun tulostimme listan, se näytti kaikki siihen tallennetut oliot.

Entä jos sinulla on taulukko ja haluat muuntaa sen listaksi? Voit tehdä tämän käyttämällä asList()-luokan Arrays-metodia.

Tämä metodi mahdollistaa listan luomisen, joka sisältää samat alkiot kuin alkuperäinen taulukko. Se on erityisen hyödyllinen, kun haluamme käyttää listan metodeja taulukkoon. Syntaksi on yksinkertainen:

Arrays.asList(arrayName);

Ja voit käyttää sitä suoraan uuden listan alustuksessa, esimerkiksi:

Main.java

Main.java

12345678910111213141516171819202122232425262728293031323334
package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); Dog[] dogs = {bob, ben, brian}; List<Dog> dogList = new ArrayList<>(Arrays.asList(dogs)); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

Samalla tavalla kuin voit muuntaa taulukon listaksi, voit myös muuntaa listan taulukoksi käyttämällä toArray()-metodia.

ArrayList<>-metodit

Käydään läpi peruslistametodit. Tähän asti listat olisi voinut helposti korvata taulukoilla, mutta tässä on olennainen ero—metodit.

add()-metodi on ylikuormitettu metodi, eli sillä on useita muunnelmia. Yksi niistä mahdollistaa alkion lisäämisen tiettyyn indeksiin.

Kun lisäät alkion listan keskelle, kaikki oikealla olevat alkiot siirtyvät yhden sijainnin oikealle tehdäkseen tilaa uudelle alkiolle.

Jos esimerkiksi lisäät alkion listan alkuun, kaikki olemassa olevat alkiot siirtyvät yhden sijainnin oikealle.

Tarkastellaan esimerkkiä:

Main.java

Main.java

123456789101112131415161718
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 5; i++) { // Filling `numbers` list with 5 values numbers.add(i); } System.out.println("`numbers` before modifying: " + numbers); numbers.add(2, 10); // Adding 10 on the second index System.out.println("`numbers` after first modifying: " + numbers); numbers.add(0, 5); System.out.println("`numbers` after second modifying: " + numbers); } }

Arvojen siirtymistä elementtiä lisättäessä voidaan havainnollistaa seuraavalla kuvalla:

Alkioiden hakeminen

Jos voit lisätä olioita listaan tiettyyn indeksiin, voit myös hakea olioita niiden indeksin perusteella käyttämällä get(int index) -metodia.

Tarkastellaan esimerkkiä:

Main.java

Main.java

12345678910111213141516171819
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie"); names.add("David"); names.add("Eva"); // Retrieving element by index String element = names.get(2); // Retrieving the 3rd element (index starts from 0) System.out.println("The element at index 2 is: " + element); } }

Alkioiden poistaminen

Voit lisätä, voit hakea, mutta voitko poistaa? Totta kai! Voit poistaa alkioita käyttämällä remove(int index) -metodia.

Tämä metodi on myös ylikuormitettu, eli on olemassa toinenkin tapa poistaa alkio. Voit käyttää remove(Object obj) -metodia, joka poistaa ensimmäisen esiintymän annetusta alkiosta.

Kuvitellaanpa, että sinulla on suuri lista kaikista kurssimme opiskelijoista. Kuitenkin yksi opiskelija käyttäytyi huonosti ja erotettiin. Et tiedä hänen tarkkaa indeksiään, joten sinun täytyy poistaa hänet nimen perusteella. Mutta tässä on haaste—koodi on hieman rikki, ja hänen nimensä saattaa esiintyä useita kertoja listassa.

Kirjoitetaan ohjelma, joka poistaa kaikki tämän opiskelijan esiintymät listasta:

Main.java

Main.java

123456789101112131415161718
package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // Expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); while (students.contains("Bob")) { students.remove("Bob"); } System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }

Olet ehkä huomannut, että käytimme toista listan metodiacontains(Object obj). Tämä metodi tarkistaa, onko määritetty alkio listassa, ja palauttaa true tai false.

Käyttämällä contains()-metodia asetamme ehdon while-silmukalle, jolloin voimme poistaa kaikki opiskelijan, kuten "Bob", esiintymät listasta.

Tämän voi muuten tehdä huomattavasti helpommin käyttämällä removeAll(Collection<?> c) -metodia:

Main.java

Main.java

123456789101112131415161718
package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // Expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); List<String> expelledStudents = new ArrayList<>(); expelledStudents.add("Bob"); students.removeAll(expelledStudents); System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }

Metodi removeAll() ottaa kokoelman parametrina, joka sisältää arvot, jotka poistetaan listasta, jolle metodia kutsutaan.

Tässä lähestymistavassa loimme kokoelman erotetuista opiskelijoista ja lisäsimme siihen "Bobin". Tämä tekee koodista helposti laajennettavan—voit lisätä uusia häiriköitä erotettujen opiskelijoiden listaan ajan myötä.

Arvon päivittäminen indeksin perusteella

Palataan takaisin listan metodeihin—nyt vuorossa on päivitysmetodi.

Koska add()-metodi vain siirtää kaikki alkiot oikealle lisättäessä uusi arvo, tarvitaan eri tapa päivittää olemassa oleva arvo indeksin perusteella.

Metodi set(int index, Object value) tekee juuri tämän:

Main.java

Main.java

12345678910111213141516
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> example = new ArrayList<>(); for (int i = 1; i <= 5; i++) { example.add(i); } System.out.println("List before modification: " + example); example.set(2, 28); System.out.println("List after modification: " + example); } }

Tämä on varsin yksinkertaista—korvasimme toisessa indeksissä olevan alkion luvulla 28.

Muut metodit

Olet jo käynyt läpi yleisimmät metodit, mutta niitä on paljon enemmän. Koska niitä käytetään harvoin, emme keskity jokaiseen erikseen.

Sen sijaan löydät kaikki tarvitsemasi metodit — sekä täydellisen dokumentaation ja yksityiskohtaiset selitykset — avaamalla ArrayList-luokan IntelliJ IDEA -ohjelmassa.

Voit tehdä tämän tuomalla ensin ArrayList-kirjaston, pitämällä Command key-näppäintä (Ctrl Windowsissa) pohjassa ja klikkaamalla ArrayList-luokkaa. Näin näet kaikki luokan kentät ja metodit, mikä auttaa sinua tutkimaan mahdollisesti ohittamiasi metodeja.

1. Mitä metodia voidaan käyttää alkion lisäämiseen tiettyyn indeksiin?

2. Mitä metodia voidaan käyttää alkion hakemiseen indeksin perusteella?

3. Mitä metodia voidaan käyttää ensimmäisen esiintymän poistamiseen?

4. Mitä metodia voidaan käyttää alkion korvaamiseen indeksin perusteella?

5. Mitä metodia voidaan käyttää tarkistamaan, onko alkio olemassa?

6. Voimmeko luoda listan taulukosta?

7. Miten voimme luoda listan taulukosta?

question mark

Mitä metodia voidaan käyttää alkion lisäämiseen tiettyyn indeksiin?

Valitse oikea vastaus

question mark

Mitä metodia voidaan käyttää alkion hakemiseen indeksin perusteella?

Valitse oikea vastaus

question mark

Mitä metodia voidaan käyttää ensimmäisen esiintymän poistamiseen?

Valitse oikea vastaus

question mark

Mitä metodia voidaan käyttää alkion korvaamiseen indeksin perusteella?

Valitse oikea vastaus

question mark

Mitä metodia voidaan käyttää tarkistamaan, onko alkio olemassa?

Valitse oikea vastaus

question mark

Voimmeko luoda listan taulukosta?

Valitse oikea vastaus

question mark

Miten voimme luoda listan taulukosta?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 2

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 1. Luku 2
some-alt