„Hi, Amigo.“
„Hey, Ritschie.“
„Ellie sagte mir, du hättest gerne mehr Beispiele für Collections. Ich gebe dir ein paar. Hier ist eine Liste der Collections und Schnittstellen:“
Schnittstelle | Klasse/Implementierung | Beschreibung |
---|---|---|
List | ArrayList | List |
LinkedList | List | |
Vector | Vector | |
Stack | Stack | |
Set | HashSet | Set |
TreeSet | Set | |
SortedSet | Sorted set | |
Map | HashMap | Map/dictionary |
TreeMap | Map/dictionary | |
SortedMap | Sorted dictionary | |
Hashtable | Hash-table |
„Hmm. Das sind ja eine ganze Menge. Vier Listen, drei Sets und vier Maps.“
„Ja, das sind alles verschiedene Implementierungen der Schnittstellen List, Set und Map.“
„Worin besteht der Unterschied zwischen diesen Implementierungen?“
„Genau darüber möchte ich heute mit dir sprechen. Hab ein wenig Geduld.“
„Hast du sonst noch Fragen?“
„Ich weiß, wie man eine Liste auf dem Bildschirm anzeigt. Wie kann ich ein Set oder eine Map anzeigen?“
„Die Elemente einer Liste haben eine feste Reihenfolge, du kannst sie also einfach über einen Index anzeigen. Bei einem Set oder eine Map gibt es keine bestimmte Reihenfolge. Tatsächlich kann sich die Reihenfolge der Elemente ändern, wenn Elemente gelöscht oder neue Elemente hinzugefügt werden.“
„Unglaublich.“
„Deshalb wurden spezielle Objekte, sogenannte Iteratoren, erfunden, um mit den Elementen von Collections zu arbeiten. Mit ihnen kannst du alle Elemente einer Collection durchgehen, auch wenn sie nur Namen statt Indizes (Map) oder weder Namen noch Indizes (Set) besitzen.“
„Hier ein paar Beispiele:“
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("Rain");
set.add("In");
set.add("Spain");
// Get an iterator for the set
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) // Check if there is another element
{
// Get the current element and move to the next one
String text = iterator.next();
System.out.println(text);
}
}
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("Rain");
list.add("In");
list.add("Spain");
Iterator<String> iterator = list.iterator();// Get an iterator for the list
while (iterator.hasNext()) // Check if there is another element
{
// Get the current element and move to the next one
String text = iterator.next();
System.out.println(text);
}
}
public static void main(String[] args)
{
// All elements are stored in pairs
Map<String, String> map = new HashMap<String, String>();
map.put("first", "Rain");
map.put("second", "In");
map.put("third", "Spain");
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext())
{
// Get a key-value pair
Map.Entry<String, String> pair = iterator.next();
String key = pair.getKey(); // Key
String value = pair.getValue(); // Value
System.out.println(key + ":" + value);
}
}
„Wow! Ich frage mich, was das alles bedeutet.“
„Es ist eigentlich ganz einfach. Zuerst rufen wir ein spezielles Objekt, einen Iterator, aus der Collection ab. Der Iterator hat nur zwei Methoden.
1. Die Methode next() gibt das nächste Element in der Collection zurück.
2. Die Methode hasNext() prüft, ob es noch Elemente gibt, die nicht von next() zurückgegeben wurden.“
„Okay. Ich glaube, jetzt verstehe ich es so langsam. Lass mich versuchen, zu wiederholen, wie ich es verstanden habe.“
„Also... Zuerst müssen wir die iterator()-Methode einer Collection aufrufen, um dieses magische Iterator-Objekt zu erhalten.“
„Dann rufen wir die Elemente nacheinander ab, bis keine zum Abrufen mehr vorhanden sind. Wir rufen das nächste Element in der Collection durch Aufruf von next() ab, und wir überprüfen, ob es noch Elemente in der Collection gibt, indem wir die hasNext()-Methode des Iterators aufrufen. Ist das richtig?“
„Ja, mehr oder weniger. Aber warte auf den guten Teil.“
„Java bietet eine Abkürzung für die Arbeit mit Iteratoren. Nach dem Muster von while und for wurde eine weitere besondere Anweisung hinzugefügt: for each. Sie wird ebenfalls durch das Schlüsselwort for angezeigt.“
„Die for-each-Anweisung wird nur für die Arbeit mit Collections und Containern verwendet. Implizit verwendet sie einen Iterator, aber wir sehen nur das zurückgegebene Element.“
„Ich möchte dir die lange und kurze Variante zeigen, mit einem Iterator zu arbeiten:“
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("Rain");
set.add("In");
set.add("Spain");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext())
{
String text = iterator.next();
System.out.println(text);
}
}
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("Rain");
set.add("In");
set.add("Spain");
for (String text : set)
{
System.out.println(text);
}
}
„Beachte bitte, dass die rot oder grün markierten Wörter im rechten Teil fehlen. Tatsächlich werden drei Zeilen durch eine ersetzt:“
Iterator<String> iterator = set.iterator();
while (iterator.hasNext())
{
String text = iterator.next();
for (String text : set)
„Das sieht toll aus. Mir gefällt es so viel besser.“
„Sehen wir uns die Kurzfassung der obigen Beispiele an:“
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("Rain");
set.add("In");
set.add("Spain");
for (String text : set)
{
System.out.println(text);
}
}
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("Rain");
list.add("In");
list.add("Spain");
for (String text : list)
{
System.out.println(text);
}
}
public static void main(String[] args)
{
Map<String, String> map = new HashMap<String, String>();
map.put("first", "Rain");
map.put("second", "In");
map.put("third", "Spain");
for (Map.Entry<String, String> pair : map.entrySet())
{
String key = pair.getKey(); // Key
String value = pair.getValue(); // Value
System.out.println(key + ":" + value);
}
}
„So macht man das!“
„Ich bin froh, dass es dir gefällt.“
GO TO FULL VERSION