In Java implementieren Sammlungen Datenstrukturen zur Arbeit mit Gruppen von Objekten. Die Hauptstrukturen:
ArrayList (implementiert das Interface List) speichert Elemente in einem Array, bietet schnellen Zugriff über den Index, das Einfügen/Löschen von Elementen in der Mitte ist jedoch langsam, da ein Verschieben der Elemente erforderlich ist.
LinkedList (implementiert ebenfalls List) basiert auf einer doppelt verketteten Liste. Es fügt Elemente schnell in der Mitte ein/entfernt sie, der Zugriff über den Index ist jedoch langsam, da man die Liste vom Anfang oder Ende durchlaufen muss.
HashMap implementiert das Interface Map. Sie speichert Schlüssel-Wert-Paare. Der schnelle Zugriff (O(1)) auf Werte über den Schlüssel erfolgt durch eine Hash-Funktion, garantiert jedoch keine Reihenfolge der Elemente.
List<String> arrayList = new ArrayList<>(); arrayList.add("A"); // schnell arrayList.get(0); // schnell List<String> linkedList = new LinkedList<>(); linkedList.add("A"); // etwas langsamer linkedList.add(0, "B"); // schnell Map<String, Integer> map = new HashMap<>(); map.put("one", 1); Integer val = map.get("one"); // schnell
Was ist der grundsätzliche Unterschied zwischen HashMap und Hashtable, und warum wird Hashtable in modernem Code kaum noch verwendet?
Antwort: HashMap ist nicht synchronisiert, erlaubt null sowohl als Schlüssel als auch als Wert. Hashtable ist synchronisiert (mehrere Threads können an einem Objekt arbeiten, ohne die Integrität zu gefährden), erlaubt jedoch kein null und ist langsamer. Im modernen Code wird häufiger ConcurrentHashMap zur Thread-Sicherheit verwendet, da es effizienter ist und besser für Mehrfachverarbeitungsberechnungen konfiguriert werden kann.
Map<String, String> map1 = new HashMap<>(); map1.put(null, "value"); // OK Map<String, String> map2 = new Hashtable<>(); map2.put(null, "value"); // NullPointerException
Geschichte
Im Schülerverwaltungssystem wurde ArrayList für häufige Einfügungen und Löschungen in der Mitte der Liste verwendet, was zu einer erheblichen Leistungsverschlechterung bei großen Datenmengen führte. Nach dem Wechsel zu LinkedList normalisierte sich die Situation.
Geschichte
In einem multithreaded CRM-System wurde HashMap zur Speicherung von Daten zwischen Threads ohne Synchronisierung verwendet, was gelegentlich zu inkonsistenten Daten und Abstürzen aufgrund von Race Conditions führte. Nach dem Übergang zu ConcurrentHashMap verschwand der Bug.
Geschichte
Ein Entwickler versuchte, einen null-Schlüssel in Hashtable einzufügen, ohne über das Verbot Bescheid zu wissen. Dies führte zu einer NullPointerException, und es dauerte lange, bis herausgefunden wurde, warum die Anwendung unerwartet abstürzte.