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:
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. |