programmera.net -> java -> normal     för utskrift      info@programmera.net

Samlingar

1. Gränssnitten
2. Collection
3. Iterator
4. Set
5. SortedSet
6. List
7. ListIterator
8. Map
9. Map.Entry
10. SortedMap
11. Collections

1. Gränssnitten

Javas sätt att gruppera objekt har en anknytning till matematiska begrepp. Av varje matematiskt begrepp har man gjort ett gränssnitt. Genom att bara använda metoderna som definieras i gränssnittet kan man lätt byta bort samlingsklassen då den blir omodern. I följande lista tas de grundläggande begreppen och gränssnitten upp:

Begrepp Gränssnitt Klasser Beskrivning
Samling  Collection  -  En grupp objekt.
Lista  List  ArrayList, LinkedList  En grupp objekt som har en position.
Mängd  Set  HashSet  En grupp unika objekt.
Sorterad Mängd  SortedSet  TreeSet  En grupp unika objekt som är sorterade. Bokstäverna A till Ö är ett exempel på en sorterad mängd.
Karta  Map  HashMap  En grupp objekt där varje objekt har en unik nyckel.
Sorterad Karta  SortedMap  TreeMap  En grupp objekt där varje objekt har en unik nyckel, och där nycklarna är sorterade.

De klasser som listas i tabellen ovan är bara exempel på klasser som implementerar gränssnintten. Hirarkin bland gränssnitten är som följer:

Collection
  +--List	
  +--Set
      +--SortedSet

Map
 +--SortedMap

2. Collection

Detta gränssnitt kan implementeras utan att man egentligen implementerar alla metoder. Om Obligatorisk i tabellen nedan är nej, kan metoden implementeras genom att den kastar UnsupportedOperationException (runtime, behöver ingen try-sats). Anledningen till detta förfarande är att det ska gå att skapa samlingsklasser utan metoder för att ändra innehållet i samlingen, men som ändå implementerar gränssnittet. Nedan listas gränssnittets metoder:

Metod Returtyp Obligatorisk Beskrivning
add(Obj)  boolean  Nej  Lägger till ett element Obj.
addAll(Col)  boolean  Nej  Lägger till alla element från samlingen Col.
remove(Obj)  boolean  Nej  Tar bort elementet Obj (ett element tas bort om flera finns).
removeAll(Col)  boolean  Nej  Tar bort alla element i samlingen Col.
retainAll(Col)  boolean  Nej  Tar bort alla element utom de i samlingen Col.
clear()  void  Nej  Tar bort alla element.
contains(Obj)  boolean  Ja  Kollar om ett element Obj finns i samlingen.
containsAll(Col)  boolean  Ja  Kollar om alla element i samlingen Col finns i samlingen.
equals(Col)  boolean  Ja  Kollar om samlingen Col är har samma storlek och innehåller samma element som samlingen.
hashCode()  int  Ja  Genenrerar en hashkod för samlingen. Hashkoden är summan av alla elementens hashkoder.
isEmpty()  boolean  Ja  Returnerar true om samlingen är tom.
iterator()  Iterator  Ja  Returnerar en Iterator för samlingen.
size()  int  Ja  Returnerar antal element.
toArray()  Object[]  Ja  Returnerar en array med alla samlingens element.
toArray(Obj[])  Object[]  Ja  Som toArray() men metoden försöker lagra elementen i arrayen Obj[]. Om Obj[] är för liten returneras en ny array. Kastar ArrayStoreException om något element inte är av klassen Obj.

3. Iterator

Med detta gränssnitt kan man bekvämt stega igenom en samling. Eftersom en samling inte är ordnad på något sätt kan detta vara det enda sättet att få ut samtliga element. En Iterator har följande metoder:

Metod Returtyp Beskrivning
hasNext()  boolean  Returnerar true om det finns ännu ett element.
next()  Object  Returnerar nästa element.
remove()  void  Tar bort senaste element som returnerats med next().

Ett exempel på hur Iterator används är:
import java.util.*;

class TestIterator{
  public static void main(String[] args){
    ArrayList al=new ArrayList();
    al.add("Hejsan");
    al.add("Alla");
    al.add("Glada");
    Iterator i=al.iterator();
    while(i.hasNext()){
      String e=(String) i.next();
      System.out.println("s="+e);
    }
  }
}
Vi kör programmet:
[olle@dev1]$ java TestIterator
s=Hejsan
s=Alla
s=Glada
Om en annan tråd håller på att ändra i samlingen samtidigt som iteratorn stegar igenom den kastas ConcurrentModificatoinException (runtime).

4. Set

Gränssnittet Set ärver av Collection. I ett Set får ett element ej läggas till mer än en gång. Om man försöker lägga till ett element som redan finns händer ingenting. Gränssnittet har samma metoder som Collection. Exempel på en klass som implementerar Set är:

  • HashSet Denna klass lagrar unika element i en hashtabell. Därför måste alla element som ska lagras implementera hashCode(). Om du har skapat en klass som ärver av Object ska du överrida den ursprungliga hashCode() som finns i Object.
  • LinkedHashSet Nyhet i Java 1.4. Som HashSet, men elementen är ordnade efter hur de adderades.
Vi testar denna samlingsklass:
import java.util.*;

class TestHashSet{
  public static void main(String[] args){
    HashSet hs=new HashSet();
    hs.add("Hejsan");
    hs.add("Alla");
    hs.add("Glada");
    System.out.println(hs);
  }
}
Elementen kan komma i viken ordning som helst:
[olle@dev1]$ java TestHashSet
[Glada, Hejsan, Alla]

5. SortedSet

Detta gränssnitt ärver av Set. För detta gränssnitt gäller att mängden dessutom ska vara sorterad. Ett exempel på en sorterad mängd ur verkliga livet är bokstäverna A till Ö. De är alla unika och har inbördes ordning. Element som ska lagras i SortedSet måste implementera gränssnittet Comparable, dvs. ha metoden compareTo(Obj).

Metod Returtyp Obligatorisk Beskrivning
first()  Object  Ja  Returnerar det första elementet.
last()  Object  Ja  Returnerar det sista elementet.
headSet(to)  SortedSet  Ja  Returnerar de element mindre än to.
subSet(from,to)  SortedSet  Ja  Returnerar de element större eller lika med elementet from, och mindre än to.
tailSet(from)  SortedSet  Ja  Returnerar de elementet större eller lika med from.

Den enda klass som implementerar SortedSet är:

  • TreeSet Denna klass lagrar unika element i en trädstruktur.
Vi testar denna samlingsklass:
import java.util.*;

class TestTreeSet{
  public static void main(String[] args){
    TreeSet s=new TreeSet();
    s.add("Hejsan");
    s.add("Alla");
    s.add("Glada");
    System.out.println(s);
  }
}
Och vi får en sorterad utskrift:
[olle@dev1]$ java TestTreeSet
[Alla, Glada, Hejsan]

6. List

Detta gränssnitt ärver från Collection. För detta gränssnitt gäller att elementen ska vara ordnade i en numerisk ordning. Gränssnittet innehåller förutom metoderna i Collection några nya, som alla har med ordningen att göra:

Metod Returtyp Obligatorisk Beskrivning
add(i,Obj)  void  Nej  Lägger till elementet Obj på index i.
addAll(i,Col)  boolean  Nej  Lägger till samlingen Col på index i.
set(i,Obj)  Object  Nej  Ersätter elementet på index i med Obj. Returnerar elementet tidigare på index i.
remove(i)  boolean  Nej  Tar bort elementet på index i.
get(i)  Object  Ja  Returnerar elementet på index i.
indexOf(Obj)  int  Ja  Returnerar index av första förekomsten av elementet Obj.
lastIndexOf(Obj)  int  Ja  Returnerar index av sista förekomsten av elementet Obj.
listIterator()  ListIterator  Ja  Returnerar en ListeIterator.
listIterator(i)  ListIterator  Ja  Returnerar en ListIterator från index i.
subList(from, to)  List  Ja  Returnerar en del av Listan från och med index from till och med elementet innan index to.

Exempel på klasser som implementerar List är:

  • ArrayList Optimerad för åtkomst via index.
  • LinkedList Optimerad för insättandet och borttagandet av element. Denna klass har några metoder utöver de i List, som gör det lättare att tänka sig samlingen som en kö eller en stack.
  • Vector Kvarleva från Java 1.0. Problemet med denna klass är att dess metoder är synchronized. Detta ger en märkbar overhead.

7. ListIterator

Denna gränssnitt ärver av Iterator. Med ListIterator kan man även anropa följande metoder:

Metod Returtyp Obligatorisk Beskrivning
add(Obj)  void  Nej  Lägger till elementet Obj före det element som skulle ha returneras av next().
remove()  void  Nej  Tar bort elementet som senast returnerades av next() eller previous().
set(Obj)  void  Nej  Ersätter elementet som senast returnerades av next() eller previous() med Obj.
previous()  Object  Ja  Returnerar föregående element.
hasPrevious()  boolean  Ja  Returnerar true om det finns ett föregående element.
nextIndex()  int  Ja  Returnerar nästa elements index.
previousIndex()  int  Ja  Returnerar föregående elements index.

8. Map

Detta gränssnitt är inte en subklass till Collection, utan definierar sina egna metoder. En karta är en samling nyckel/värde-par där nycklarna måste vara unika, men värdena kan vara dubblerade. Både nyckeln och värdet är av typen Object, kan alltså vara vad som helst. Följande metoder finns:

Metod Returtyp Obligatorisk Beskrivning
put(keyObj,valObj)  Object  Nej  Lägger till nyckel/värde-paret. Returnerar tidigare värde knutet till nyckeln, eller null om inget par finns.
putAll(Map)  void  Nej  Lägger till kartan Map.
remove(keyObj)  Object  Nej  Tar bort nyckel/värde paret med nyckel keyObj och returnerar värdet.
clear()  void  Nej  Tar bort allt.
get(keyObj)  Object  Ja  Returnerar värdet som hör till nyckeln keyObj.
containsKey(keyObj)  boolean  Ja  Returnerar true om nyckeln keyObj finns.
containsValue(valObj)  boolean  Ja  Returnerar true om värdet valObj finns en eller fler gånger.
isEmpty()  boolean  Ja  Returnerar true om kartan är tom.
equals(Map)  boolean  Ja  Returnerar true om kartan Map har samma storlek som kartan och innehåller samma nyckel/värde-par.
size()  int  Ja  Returnerar antalet nyckel/värde-par.
hashCode()  int  Ja  Returnerar hashkoden för kartan. Hashkoden är summan av hashkoderna för alla nyckel/värde-par.
keySet()  Set  Ja  Returnerar mängden av alla nycklar.
values()  Collection  Ja  Returnerar samlingen av alla värden.
entrySet()  Set  Ja  Returnerar en mängd av alla nyckel/värde-par. Varje par är av typen Map.Entry.

Här är exempel på klasser som implementerar gränssnittet:

  • HashMap
  • LinkedHashMap Nyhet i Java 1.4. Som HashMap, men nycklarna är ordnade efter hur de adderades.
  • Hashtable Kvarleva från Java 1.0. Problemet med denna klass är att dess metoder är synchronized. Detta ger en märkbar overhead.

9. Map.Entry

Det enda sättet att komma åt ett Map.Entry-objekt är att anropa metoden Map.entrySet() som returnerar en samling av sådana objekt. Du kan sedan stega igenom samlingen genom att begära en Iterator med metoden iterator(). Gränssnittet Map.Entry innehåller en del praktiska metoder för ett nyckel/värde-par:

Metod Returtyp Obligatorisk Beskrivning
setValue(valObj)  Object  Nej  Ersätter värdet med valObj.
getKey()  Object  Ja  Returnerar nyckeln.
getValue()  Object  Ja  Returnerar värdet.
equals(eObj)  boolean  Ja  Returnerar true om eObj är samma nyckel/värde-par.
hashCode()  int  Ja  Returnerar nyckel/värde-parets hashkod.

10. SortedMap

Detta gränssnitt ärver från Map. I en SortedMap ska nycklarna vara sorterade i en stigande ordning. En sorterad karta från verkliga livet är ett uppslagsverk, där man slår upp ett sorterat nyckelord, och får en beskrivning. På samma sätt som med SortedSet ska nycklarna implementera gränssnittet Comparable, d.v.s. ha metoden compareTo(Obj). Ofta räcker det med att använda String som nyckel, så då behöver man inte fundera mer på det. SortedMap utökar Map med några nya metoder:

Metod Returtyp Obligatorisk Beskrivning
firstKey()  Object  Ja  Returnerar den lägsta nyckeln.
lastKey()  Object  Ja  Returnerar den högsta nyckeln.
headMap(toKey)  SortedMap  Ja  Returnerar den del av kartan där alla nycklar är mindre än keyObj.
subMap(fromKey,toKey)  SortedMap  Ja  Returnerar den del av kartan där alla nycklar är mindre än toKey och större än eller lika med fromKey.
tailMap(fromKey)  SortedMap  Ja  Returnerar den del av kartan där alla nycklar är större än eller lika med fromKey.
comparator()  Comparator  Ja  Returnerar den Comparator som är associerad med kartan, eller null om nycklarna implementerar Comparable.

Den enda klass som implementerar detta gränssnitt är:

  • TreeMap

11. Collections

Det finns en klass som står lite utanför de övriga, i det att den inte lagrar några element utan opererar på samlingar. Klassen har det något förvirrande namnet Collections. Denna klass implementerar inte gränssnittet Collection. Klassen har bara statiska metoder och ingen konstruktor. Nedan listas några av klassens metoder:

Metod Returtyp Statisk Beskrivning
sort(List)  void  Ja  Sorterar listan då alla elementen implementerar Comparable.
sort(List, Comparator)  void  Ja  Sorterar listan med hjälp av Comparator.
shuffle(List)  void  Ja  Blandar listan då alla element implementerar Comparable.
shuffle(List, Comparator)  void  Ja  Blandar listan med hjälp av Comparator.
max(Col)  Object  Ja  Returnerar det största elementet då alla elementen implementerar Comparable.
max(Col, Comparator)  Object  Ja  Returnerar det största elementet med hjälp av Comparator.
min(Col)  Object  Ja  Returnerar det mista elementet då alla elementen implementerar Comparable.
mim(Col, Comparator)  Object  Ja  Returnerar det minsta elementet med hjälp av Comparator.