Listor

Datatyper och undantag i Java

Jim White

Java Developer

List-gränssnittet

  • List-gränssnittet, undergränssnitt till Collection
    • Definierar en ordnad grupp av objekt
    • Kan innehålla dubbletter
  • Flera implementationer av List
    • Alla beter sig på liknande sätt
    • Implementationen avgör hur objekt hanteras internt
Datatyper och undantag i Java

List-implementationer

  • ArrayList – en storleksanpassad, indexerad (likt arrayer) och ordnad lista av objekt

ArrayList liknar Java-arrayer med indexerade element

  • LinkedList – objekt kopplade med länkar till nästa och föregående objekt.

LinkedList är objektlistor kopplade med pekare

  • Oavsett implementation läggs objekt till, tas bort och ändras på samma sätt
1 Se https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html för List-typer och detaljer
Datatyper och undantag i Java

ArrayList

  • Skapa en instans med new och använd generics för att ange innehållstyp
  • Lägg till ett objekt sist i listan med .add(object)
  • Hämta ett objekt med .get(index)
    • ArrayList har nollbaserat index
  • Ersätt/ändra ett objekt med .set(index, object)
  • Ta bort ett objekt med .remove(index)
  • Töm listan med .clear()
  • Räkna objekt med .size()
import java.util.ArrayList;
...
ArrayList<String> animals
  = new ArrayList<String>();

animals.add("horse"); animals.add("cow"); animals.add("horse"); // Duplicates allowed
String c = animals.get(1); // c="cow" animals.set(1, "chicken");
// Removes the first horse animals.remove(0); // Removes all objects animals.clear();
animals.size();
Datatyper och undantag i Java

Objekt och primitiver

  • Använd wrapper-klasser för att lägga till ett primitivt värde i ett Collections Framework-objekt
  • Primitiver som läggs till "autoboxas"
    • Autoboxning: processen där ett primitivt värde automatiskt omsluts av en wrapper
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(5));
list.add(6);  // 6 is automatically wrapped by Integer then added
  • Autoboxning fungerar med alla Collections Framework-objekt
Datatyper och undantag i Java

Heterogena samlingar

  • Collections Framework-datastrukturer kan vara heterogena
    • Heterogen = innehåller objekt av olika typer
    • Använd Object som parameteriserad typ
ArrayList<Object> list = new ArrayList<Object>(); // Allow any object
list.add(new Integer(5)); // Add an Integer
list.add(6); // Add an Integer using autoboxing
list.add("Hello"); // Add a String
Datatyper och undantag i Java

Iterera genom en List

  • Använd "for-each"-syntaxen för att iterera genom objekten i en List
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");

for (String animal : animals) { // fore-each to loop through all in the ArrayList
    System.out.println(animal);
}
horse
cow
chicken
Datatyper och undantag i Java

println för List

  • Innehållet i en List-instans (t.ex. ArrayList) kan visas med println
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");
System.out.println(animals);  // Display all the elements in the ArrayList

ArrayList<Object> list = new ArrayList<Object>();
list.add(5);
list.add("Hello");
System.out.println(list);  // Display all the elements in the ArrayList
[horse, cow, chicken]
[5, Hello]
Datatyper och undantag i Java

LinkedList

  • LinkedList skapas på samma sätt som ArrayList-instanser
  • LinkedList har samma metoder som ArrayList
import java.util.LinkedList;
...
LinkedList<String> cars // Create a new ...
  = new LinkedList<String>(); // ... LinkedList
cars.add("Ford"); // Add an object to the list
cars.add("Mercedes");
String c = cars.get(1);
cars.set(1, "Toyota"); // Replace an object
System.out.println(cars); // Display the list
cars.remove(0); // Remove an object
cars.clear();  // Remove all objects
cars.size(); // Get the list length
[Ford, Toyota]
Datatyper och undantag i Java

Ytterligare LinkedList-metoder

  • Ytterligare metoder
    • addFirst() lägg till i början av listan
    • addLast() lägg till i slutet av listan
    • removeFirst() ta bort från början
    • removeLast() ta bort från slutet
cars.addFirst("Fiat"); // Add to the beginning
cars.addLast("BMW"); // Add the the end
cars.removeFirst(); // Remove the first object
cars.removeLast(); // Remove the last object
Datatyper och undantag i Java

Likheter mellan samlingstyper

  • ArrayList och LinkedList ser likadana ut
    • Andra typer i Collections Framework har också likheter
    • Det är avsiktligt
  • De delar ett gränssnitt: List
    • Ett exempel på polymorfism ("många former")
Datatyper och undantag i Java

ArrayList vs LinkedList

  • Operationer på ArrayList och LinkedList (eller vilken List som helst) är desamma
    • Valet av List-typ beror på användningsfall
  • Att tänka på med ArrayList:
    • Snabb vid slumpmässig åtkomst (t.ex. list.get(11))
    • Långsammare vid tillägg och borttagning mitt i listan
    • Eftersom objekt måste flyttas fysiskt vid infogning/borttagning

Att lägga till objekt mitt i en ArrayList kräver mycket förflyttning

Datatyper och undantag i Java

ArrayList vs LinkedList

  • Att tänka på med LinkedList:
    • Långsammare vid slumpmässig åtkomst (t.ex. list.get(11))
    • Snabbare vid tillägg och borttagning mitt i listan
    • Eftersom inga objekt flyttas fysiskt – bara ett par referenser ändras

Att lägga till objekt mitt i en LinkedList kräver bara att några pekare ändras

Datatyper och undantag i Java

Nu kör vi en övning!

Datatyper och undantag i Java

Preparing Video For Download...