# Unterschied zwischen HashMap und Hashtable



## Ay Caramba (29. Apr 2008)

Ich habe mir heute  HashMap und Hashtable angeschaut und frage mich jetzt was der Unterschied zwischen den beiden Sachen ist. Für den Anfänger in mir sieht die Syntax identisch aus und beide machen auch das gleiche.
assoziativer speicher, gibt key/value, etc


----------



## maki (29. Apr 2008)

Hashtable ist alt, nutze hashMap.


----------



## Templon (29. Apr 2008)

So weit ich mich erinnere ist es dass die Hashtable synchronized ist und die HashMap nicht (Gleich wie Vector und ArrayList).


----------



## Beni (29. Apr 2008)

Hashtable ist älter und viele Methoden sind synchronized. Man kann daher von mehreren Threads her gleichzeitig auf eine Hashtable zugreiffen - bei einer HashMap funktioniert das nicht. Dafür ist HashMap effizienter, weil es keine Synchronisation gibt.


----------



## Grasstampfer (29. Apr 2008)

maki hat gesagt.:
			
		

> Hashtable ist alt, nutze hashMap.


lol - was für ein unsinniges & falsches argument...

lies einfach mal die beiden API beschreibungen
http://java.sun.com/javase/6/docs/api/java/util/Hashtable.html
http://java.sun.com/javase/6/docs/api/java/util/HashMap.html



> The HashMap  class is roughly equivalent to Hashtable, except that it is *unsynchronized* and *permits nulls*.


----------



## SlaterB (29. Apr 2008)

C ist alt, nutze Java


----------



## Templon (29. Apr 2008)

maki hat gesagt.:
			
		

> Hashtable ist alt, nutze hashMap.



Naja das stimmt nicht ganz, die Hashtable unterscheidet sich nur durch die synchronized Methoden und sie lässt null zu. Je nach dem kann man das bestimmt gebrauchen.


----------



## maki (29. Apr 2008)

Grasstampfer hat gesagt.:
			
		

> maki hat gesagt.:
> 
> 
> 
> ...


Bla, was für ein überflüssiger Post.

Lies einfach mal die Einführung zur Collection API: http://java.sun.com/j2se/1.4.2/docs/guide/collections/index.html

Dann sollte dir auffallen das Hashtable (genauso wie Vector) veraltet ist, retrofit hin oder her.

Wie man synchronisierte Maps erstellt ist dir aber schon klar? Wenn nicht, einfach fragen...


----------



## Ay Caramba (29. Apr 2008)

Danke für die schnellen Antworten. Das mit null habe ich jetzt auch wieder gesehen. 
Bei Hashtable dürfen key,value nicht null sein, bei einer HashMap ist das jedoch erlaubt.

Aber was wird denn ganz konkret mit "synchronisation" gemeint.  Kann jemand ein ganz simples Beispiel mit Worten einfach umschreiben?


----------



## Grasstampfer (29. Apr 2008)

maki hat gesagt.:
			
		

> Grasstampfer hat gesagt.:
> 
> 
> 
> ...


ändert nix an deiner nicht korrekten aussage ;-)



			
				maki hat gesagt.:
			
		

> Wie man synchronisierte Maps erstellt ist dir aber schon klar? Wenn nicht, einfach fragen...


nö - nicht mal den blassesten schimmer... brauch ich das ? und wie ? und was sind Maps ?


----------



## maki (29. Apr 2008)

> Aber was wird denn ganz konkret mit "synchronisation" gemeint. Kann jemand ein ganz simples Beispiel mit Worten einfach umschreiben?


Synchronisiert (auch Thread-safe genannt) bedeutet vereinfacht, das nur ein Thread auf einmal darauf zugreifen darf, wichtig wenn mehrere Threads auf die Daten zugreifen, sonst ändert unter umständen  ein Thread die Daten die ein anderer gerade liest -> undefiniertes Ergebnis



> brauch ich das ?


Keine Ahnung ob du das brauchst.



> und wie ?


http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#synchronizedMap(java.util.Map)



> und was sind Maps ?


Maps ist der plural von map


----------



## Leroy42 (29. Apr 2008)

maki hat gesagt.:
			
		

> Hashtable ist alt, nutze hashMap.





			
				ich hat gesagt.:
			
		

> maki wird alt, nutze Beni.


 :bae:


----------



## tfa (29. Apr 2008)

maki hat gesagt.:
			
		

> Hashtable ist alt, nutze hashMap.


Ich bin dafür, dass Hashtable und Vector als "deprecated" markiert werden.
Aber das wird Sun wohl nie tun...


----------



## maki (29. Apr 2008)

Leroy42 hat gesagt.:
			
		

> maki hat gesagt.:
> 
> 
> 
> ...


rofl



			
				tfa hat gesagt.:
			
		

> maki hat gesagt.:
> 
> 
> 
> ...


Sehe ich genauso, verstehe aber nicht warum sie nicht schon längst deprecated sind.

Quereinsteiger aus anderen Sprachen (zB. Perl) werden sich zuerst darauf stürzen (wiedererkennungswert), verkennen dabei vollkommen die eigentliche Collection API, zB. den Vorteil, gegen Interfaces zu programmieren und die Implementierung austauschbar zu haben, oder selbst mit einer paar Zeilen Code eine neue, an die speziellen Bedürfnisse angepasste  Implementierung zu schreiben.

Vorteile von Hashtable/Vector? Sehe ich keine, wirklich nicht.


----------



## Grasstampfer (30. Apr 2008)

maki hat gesagt.:
			
		

> Quereinsteiger aus anderen Sprachen (zB. Perl) werden sich zuerst darauf stürzen (wiedererkennungswert), verkennen dabei vollkommen die eigentliche Collection API, zB. den Vorteil, gegen Interfaces zu programmieren und die Implementierung austauschbar zu haben, oder selbst mit einer paar Zeilen Code eine neue, an die speziellen Bedürfnisse angepasste  Implementierung zu schreiben.
> 
> Vorteile von Hashtable/Vector? Sehe ich keine, wirklich nicht.


ok nun mal ernsthaft - klar der Sinn von Hashtable und Vectoren sei mal dahingestellt, aber die beiden als Argument zu nehmen, dass Quereinsteiger die eigentlich Collection API verkennen usw halte ich für übertrieben. Quereinsteiger bzw Anfänger werden anfangs nie gegen ein Interface programmieren, egal ob nun Hashtable oder HashMap....


----------



## maki (30. Apr 2008)

> ok nun mal ernsthaft - klar der Sinn von Hashtable und Vectoren sei mal dahingestellt, aber die beiden als Argument zu nehmen, dass Quereinsteiger die eigentlich Collection API verkennen usw halte ich für übertrieben. Quereinsteiger bzw Anfänger werden anfangs nie gegen ein Interface programmieren, egal ob nun Hashtable oder HashMap....


Nun ja, wenn für jeden Thread "List vs. Vector" bzw. "HashMap vs. Hashtable" Sun eine email bekopmmen würde, wären Hashtable und  Vector schon deprecated *g*

Sicher, sie funktionieren beide, man könnte sie verwenden, aber...

Ich halte es für Anfänger besser, die beiden nicht zu verwenden, lieber mit List und Map anfangen, es lässt sich doch einfacher erklären, dass anstatt 
ArrayList liste = new ArrayList();
besser
List liste = new ArrayList();
verwendet werden sollte, allein schon wegen den vewendeten Namen.

Ausserdem haben Vector und Hashmap ein paar Methoden, die einfach nur noch "legacy" sind.
Man könnte ja noch Hashtable#elements verwenden und hätte es dann wieder mit den "guten alten" Enumerations zu tun

Ich halte das für (Quer-)einsteiger verwirrender, als die klare Linie des Collection Frameworks.

Sowohl Vector als auch Hashtable sind redundant, die API wäre ohne sie besser dran imho, geht einem ja nichts verloren, Map und List ersetzen sie vollständig.


----------



## tfa (30. Apr 2008)

maki hat gesagt.:
			
		

> Nun ja, wenn für jeden Thread "List vs. Vector" bzw. "HashMap vs. Hashtable" Sun eine email bekopmmen würde, wären Hashtable und  Vector schon deprecated *g*



Ich glaub Sun ist da ziemlich schmerzfrei.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6201870

Jemand müsste ein RFE schreiben.


----------



## maki (30. Apr 2008)

Was mich etwas verwundert ist, dass Swing nicht angepasst wurde als das Collection Framework mit Java 1.2 eingeführt wurde.
Aber, Sun will kompatibel zu Java 1.0.2 sein, naja, das ist ja mal ein Argument...


----------



## tfa (30. Apr 2008)

Wenn die das getan hätten, wäre verdammt viel alter Code einfach mal so kaputt gegangen. Als API-Anbieter kannst du das nicht machen. Vielleicht bei irgend einer kleinen Lib, die ewig im Alpha-Stadium rumdümpelt. Aber nicht, wenn man eine Programmiersprache groß machen will. 
Es gibt noch viel mehr Hässlichkeiten: Stack, Date, Boolean- und String-Konstruktor. Das wird man nicht mehr los.


----------



## maki (30. Apr 2008)

> Es gibt noch viel mehr Hässlichkeiten: Stack, Date, Boolean- und String-Konstruktor. Das wird man nicht mehr los.


So wie Date, URL & Konsorten.

Vielleicht gibt es RFEs die einfach höhere Prioritäten haben.


----------



## SlaterB (30. Apr 2008)

kompatibel bleiben kann man ja, aber eben alles mit Vector auch in den Swing-Klassen auf deprecated setzen und List dazubauen,
so sieht mancher erst eine JTable/ JComboBox und glaubt, einen Vector benutzen zu müssen (muss man ja quasi auch an manchen Stellen)


----------

