List och ArrayList i Java
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 detta avsnitt utforskar du 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, så du behöver inte oroa dig för det.
Nu följer 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.
Om du har en array och behöver konvertera den till en lista kan du använda 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 du vill använda listmetoder på en array. Syntaxen är enkel:
Arrays.asList(arrayName);
Och du kan använda den direkt vid initiering av 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 även konvertera en lista till en array med hjälp av metoden toArray().
ArrayList<>-metoder
Genomgång av grundläggande listmetoder. Hittills hade listor enkelt kunnat ersättas 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 ett element infogas i mitten av en lista, flyttas alla element till höger en position 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 en position åt höger.
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
Om det är möjligt att lägga till objekt i en lista på ett specifikt index, är det även möjligt att hämta objekt med hjälp av deras index genom metoden get(int index).
Följande exempel illustrerar detta:
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å överlagrad, 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 känner inte till deras exakta index, så du behöver ta bort dem med namn. Men det finns ett problem—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")); } }
Metoden removeAll() tar en samling som parameter, innehållande värden som ska tas bort från listan som metoden anropas på.
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 via index
Åter till listmetoder—nu är det dags för uppdateringsmetoden.
Eftersom add()-metoden endast flyttar alla element åt höger vid insättning av ett nytt värde, behövs en annan metod för att uppdatera ett befintligt värde via index.
Metoden set(int index, Object value) gör just 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 användas för att ta bort den första förekomsten av ett element?
4. Vilken metod kan användas för att ersätta ett element via index?
5. Vilken metod kan användas 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
Can you explain the difference between ArrayList and LinkedList?
What are wrapper classes and why are they needed for lists?
Can you show more examples of using ArrayList methods?
Fantastiskt!
Completion betyg förbättrat till 4
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 detta avsnitt utforskar du 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, så du behöver inte oroa dig för det.
Nu följer 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.
Om du har en array och behöver konvertera den till en lista kan du använda 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 du vill använda listmetoder på en array. Syntaxen är enkel:
Arrays.asList(arrayName);
Och du kan använda den direkt vid initiering av 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 även konvertera en lista till en array med hjälp av metoden toArray().
ArrayList<>-metoder
Genomgång av grundläggande listmetoder. Hittills hade listor enkelt kunnat ersättas 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 ett element infogas i mitten av en lista, flyttas alla element till höger en position 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 en position åt höger.
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
Om det är möjligt att lägga till objekt i en lista på ett specifikt index, är det även möjligt att hämta objekt med hjälp av deras index genom metoden get(int index).
Följande exempel illustrerar detta:
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å överlagrad, 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 känner inte till deras exakta index, så du behöver ta bort dem med namn. Men det finns ett problem—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")); } }
Metoden removeAll() tar en samling som parameter, innehållande värden som ska tas bort från listan som metoden anropas på.
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 via index
Åter till listmetoder—nu är det dags för uppdateringsmetoden.
Eftersom add()-metoden endast flyttar alla element åt höger vid insättning av ett nytt värde, behövs en annan metod för att uppdatera ett befintligt värde via index.
Metoden set(int index, Object value) gör just 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 användas för att ta bort den första förekomsten av ett element?
4. Vilken metod kan användas för att ersätta ett element via index?
5. Vilken metod kan användas 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!