16.11.2013 Aufrufe

Programmieren in Java - HostFiXX.de

Programmieren in Java - HostFiXX.de

Programmieren in Java - HostFiXX.de

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Programmieren</strong> <strong>in</strong> <strong>Java</strong><br />

}<br />

}<br />

6.1.5 Die Klasse Hashtable und assoziative Speicher<br />

E<strong>in</strong>e Hashtabelle (Hashtable) ist e<strong>in</strong> assoziativer Speicher, <strong>de</strong>r Schlüssel (keys) mit<br />

Werten verknüpft. Die Datenstruktur ist mit e<strong>in</strong>em Wörterbuch vergleichbar. Die<br />

Hashtabelle arbeitet mit Schlüssel/Werte Paaren. Aus <strong>de</strong>m Schlüssel wird nach e<strong>in</strong>er<br />

Funktion – <strong>de</strong>r sog. Hashfunktion – e<strong>in</strong> Hashco<strong>de</strong> berechnet. Dieser dient als In<strong>de</strong>x<br />

für e<strong>in</strong> <strong>in</strong>ternes Array. Dieses Array hat zu Anfang e<strong>in</strong> feste Grösse. Lei<strong>de</strong>r hat dieses<br />

Technik e<strong>in</strong>en entschei<strong>de</strong>n<strong>de</strong>n Nachteil. Besitzen zwei Wörter <strong>de</strong>nselben Hashco<strong>de</strong>,<br />

dann kommt es zu e<strong>in</strong>er Kollision. Auf ihn muß die Datenstruktur vorbereitet se<strong>in</strong>.<br />

Hier gibt es verschie<strong>de</strong>ne Lösungsansätze. Die unter <strong>Java</strong> implementierte Variante<br />

benutzt e<strong>in</strong>e verkettete Liste (separate Cha<strong>in</strong><strong>in</strong>g). Falls e<strong>in</strong>e Kollision auftritt, so wird<br />

<strong>de</strong>r Hashco<strong>de</strong> beibehalten und <strong>de</strong>r Schlüssel bzw. Wert <strong>in</strong> e<strong>in</strong>em Listenelement an<br />

<strong>de</strong>n vorhan<strong>de</strong>nen E<strong>in</strong>trag angehängt. Wenn allerd<strong>in</strong>gs irgendwann e<strong>in</strong>mal e<strong>in</strong>e Liste<br />

durchsucht wer<strong>de</strong>n muß, dann wird die Datenstruktur langsam. E<strong>in</strong> Maß für <strong>de</strong>n<br />

Füllgrad ist <strong>de</strong>r Füllfaktor (Load Factor). Dieser liegt zwischen 0 und 100 %. 0<br />

be<strong>de</strong>utet: ke<strong>in</strong> Listenelement wird verwen<strong>de</strong>t. 100 % be<strong>de</strong>utet: Es ist ke<strong>in</strong> Platz mehr<br />

im Array und es wer<strong>de</strong>n nur noch Listen für alle zukommen<strong>de</strong>n Werte erweitert. Der<br />

Füllfaktor sollte für effiziente Anwendungen nicht höher als 75% se<strong>in</strong>. Ist e<strong>in</strong><br />

Füllfaktor nicht explizit angegeben, dann wird die Hashtabelle „rehashed“, wenn mehr<br />

als 75% aller Plätze besetzt s<strong>in</strong>d.<br />

class java.util.Hashtable extends Dictionary implements Map,<br />

Cloneable, Serializable<br />

Erzeugen von e<strong>in</strong>em Objekt <strong>de</strong>r Klasse Hashtable:<br />

public Hashtable()<br />

/* Die Hashtabelle enthält e<strong>in</strong>e Kapazität von 11 E<strong>in</strong>trägen und e<strong>in</strong>en Füllfaktor von 75 % */<br />

public Hashtable(<strong>in</strong>t <strong>in</strong>itialCapacity)<br />

/* erzeugt e<strong>in</strong>e Hashtabelle mit e<strong>in</strong>er vorgebenen Kapazität und <strong>de</strong>m Füllfaktor 0.75 */<br />

public Hashtable(<strong>in</strong>t <strong>in</strong>itialCapacity, float loadFactor)<br />

/* erzeugt e<strong>in</strong>e Hashtabelle mit e<strong>in</strong>er vorgebenen Kapazität und <strong>de</strong>m angegebenen Füllfaktor */<br />

Daten e<strong>in</strong>fügen: public Object put(Object key, Object value)<br />

/* speichert <strong>de</strong>n Schlüssel und <strong>de</strong>n Wert <strong>in</strong> <strong>de</strong>r Hashtabelle. Falls sich zu <strong>de</strong>m<br />

Schlüssel schon e<strong>in</strong> E<strong>in</strong>trag <strong>in</strong> <strong>de</strong>r Hashtabelle befand, so wird dieser<br />

zurückgegeben. An<strong>de</strong>renfalls ist <strong>de</strong>r Rückgabewert null. Die Metho<strong>de</strong> ist<br />

vorgegeben vom Interface Map. Es überschreibt die Metho<strong>de</strong> von <strong>de</strong>r Superklasse<br />

Dictionary. */<br />

Daten holen: public Object get(Object key)<br />

Schlüssel entfernen. public Object remove(Object key)<br />

Löschen <strong>de</strong>r Werte. public void clear()<br />

Test. public boolean conta<strong>in</strong>sKey(Object key)<br />

// Test auf e<strong>in</strong>en bestimmten Schlüssel<br />

public boolean conta<strong>in</strong>sValue(Object value)<br />

// Test auf e<strong>in</strong>en bestimmten Wert<br />

Aufzählen <strong>de</strong>r Elemente. Mit keys() und elements() bietet die Hashtabelle zwei<br />

Metho<strong>de</strong>n an, die e<strong>in</strong>e Aufzählung zurückgeben:<br />

public Enumeration keys()<br />

// liefert e<strong>in</strong>e Aufzählung aller Schlüssel, überschreibt keys() <strong>in</strong> Dictionary.<br />

428

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!