List och ArrayList i Java
Svep för att visa menyn
Vi börjar vår introduktion till datastrukturen List. Nedan visas ett flödesschema som illustrerar hierarkin för Collections och Lists. Det kan verka som ett stort och komplext diagram, men vi kommer att gå igenom det steg för steg.
I det här avsnittet kommer du att utforska en specifik typ av samling som kallas listor. Du kommer att titta närmare på olika listtyper, inklusive ArrayList, LinkedList och Stack.
Eftersom alla listor ärver från gränssnittet List, kan du skapa objekt med hjälp av föräldragränssnittet. Men vi kommer att fördjupa oss i det senare.
För tillfället diskuterar vi den första typen av lista – ArrayList.
Ovan ser du syntaxen för att skapa en ArrayList<>. Det finns en del som du kanske inte är bekant med – generics. Vi kommer att gå igenom generics och hur man skapar dem senare.
Kom bara ihåg att när du skapar en ArrayList anger du datatypen inom vinkelparenteser. Tänk också på att listor inte kan arbeta med primitiva datatyper. Istället använder vi wrapper-klasser.
Nu skapar vi en lista i kod och lägger till några objekt med hjälp av metoden add().
Main.java
1234567891011121314package 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); } }
Som du kan se är metoden add() mycket enkel—den lägger helt enkelt till det angivna värdet i listan.
Kom också ihåg att du måste importera List och ArrayList från biblioteket java.util. Om du använder IntelliJ IDEA importeras dock dessa bibliotek automatiskt åt dig, så du behöver inte oroa dig för det.
Nu ska vi titta på ett exempel på hur man skapar en lista med vår egen datatyp:
Main.java
1234567891011121314151617181920212223242526272829303132333435package 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 + '}'; } }
Som du kan se skapade vi vår egen klass Dog och en ArrayList med denna datatyp. När vi skrev ut listan visades alla objekt som lagrats i den.
Vad händer om du har en array och behöver konvertera den till en lista? Du kan göra detta med metoden asList() från klassen Arrays.
Denna metod gör det möjligt att skapa en lista som innehåller samma element som den ursprungliga arrayen. Det är särskilt användbart när vi vill använda listmetoder på en array. Syntaxen är enkel:
Arrays.asList(arrayName);
Och du kan använda den direkt när du initierar en ny lista, till exempel:
Main.java
12345678910111213141516171819202122232425262728293031323334package 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 + '}'; } }
Precis som du kan konvertera en array till en lista, kan du också konvertera en lista till en array med hjälp av metoden toArray().
ArrayList<>-metoder
Här går vi igenom de grundläggande listmetoderna. Hittills hade du enkelt kunnat ersätta listor med arrayer, men här är den avgörande skillnaden—metoderna.
Metoden add() är en överlagrad metod, vilket innebär att den har flera varianter. En av dessa gör det möjligt att lägga till ett element på ett specifikt index.
När du infogar ett element i mitten av en lista flyttas alla element till höger om insättningspunkten ett steg för att ge plats åt det nya elementet.
Om du till exempel lägger till ett element i början av listan, kommer alla befintliga element att flyttas ett steg åt höger.
Låt oss titta på ett exempel:
Main.java
123456789101112131415161718package 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); } }
Hur värdena förskjuts vid insättning av ett element kan visualiseras i följande illustration:
Hämtning av element
Naturligtvis, om du kan lägga till objekt i en lista på ett specifikt index, kan du även hämta objekt med hjälp av deras index genom metoden get(int index).
Låt oss titta på ett exempel:
Main.java
12345678910111213141516171819package 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); } }
Ta bort element
Du kan lägga till, du kan hämta, men kan du ta bort?
Självklart! Du kan ta bort element med metoden remove(int index).
Denna metod är också överladdad, vilket innebär att det finns ett annat sätt att ta bort ett element. Du kan använda metoden remove(Object obj), som tar bort första förekomsten av det angivna elementet.
Föreställ dig nu att du har en stor lista med alla studenter i vår kurs. Men en student uppförde sig illa och blev avstängd. Du vet inte deras exakta index, så du behöver ta bort dem med namn. Men det finns en hake—koden är lite trasig, och deras namn kan förekomma flera gånger i listan.
Låt oss skriva ett program som tar bort alla förekomster av denna student från listan:
Main.java
123456789101112131415161718package 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")); } }
Du kanske har lagt märke till att vi använde en annan listmetod—contains(Object obj). Denna metod kontrollerar om det angivna elementet finns i listan och returnerar true eller false.
Genom att använda contains() sätter vi villkoret för while-loopen, vilket gör det möjligt att ta bort alla förekomster av en student som "Bob" från listan.
För övrigt kan du förenkla denna process avsevärt genom att använda metoden removeAll(Collection<?> c):
Main.java
123456789101112131415161718package 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")); } }
removeAll()-metoden tar en samling som parameter, innehållande värden som ska tas bort från listan där metoden anropas.
I detta tillvägagångssätt skapade vi en samling av avstängda studenter och lade till "Bob" i den. Detta gör vår kod lätt att utöka—du kan enkelt lägga till fler stökiga elever i listan över avstängda studenter med tiden.
Uppdatera ett värde med index
Låt oss återgå till listmetoder—nu är det dags för uppdateringsmetoden.
Eftersom add()-metoden helt enkelt flyttar alla element åt höger vid insättning av ett nytt värde, behöver vi ett annat sätt att uppdatera ett befintligt värde med index.
Metoden set(int index, Object value) gör precis detta:
Main.java
12345678910111213141516package 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); } }
Det är ganska enkelt—vi ersatte elementet vid andra index med talet 28.
Andra metoder
Du har redan gått igenom de vanligaste metoderna, men det finns många fler. Eftersom de sällan används kommer vi inte att fokusera på var och en.
Istället kan du hitta alla metoder du behöver—tillsammans med fullständig dokumentation och detaljerade förklaringar—genom att öppna klassen ArrayList i IntelliJ IDEA.
För att göra detta, importera helt enkelt ArrayList-biblioteket, håll ned Command key (Ctrl för Windows) och klicka på ArrayList. Detta visar dig alla fält och metoder som finns tillgängliga i klassen, vilket hjälper dig att utforska eventuella metoder du kan ha missat.
1. Vilken metod kan vi använda för att lägga till ett element med hjälp av index?
2. Vilken metod kan vi använda för att hämta ett element med hjälp av index?
3. Vilken metod kan vi använda för att ta bort den första förekomsten av ett element?
4. Vilken metod kan vi använda för att ersätta ett element via index?
5. Vilken metod kan vi använda för att kontrollera om ett element finns?
6. Kan vi skapa en lista från en array?
7. Hur kan vi skapa en lista från en array?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal