Hashmap Capacity und Collision

tobiw

Neues Mitglied
Hey,

hallo erstmal. Bin froh, dass ich dieses Forum gefunden habe.
Ich bin Einsteiger in Java und habe mich gerade etwas in collections eingelesen.

Ich muss für meinen Unikurs eine Klasse schreiben, die die Funktionalität eines Sets hat.
Ich darf allerdings die java library Set Klasse nicht verwenden.

Habe mir gedacht, dass ich eine Hashmap als Speicher verwende und die restliche Funktionalität drum rum programmiere.

Was genau würde passieren, wenn ich eine hashmap mit initialCapacity
HashMap<Integer,Object> hm = HashMap<Integer,Object>(100)
erstelle und diese capacity überschritten wird?
Beispielsweise wenn ich das 101. Object einfüge?

Gehen mir Daten verloren oder wird die HashMap automatisch vergrößert?

Außerdem muss mein eigengestricktes Set unterschiedliche Objecte speichern können.
Habe mir gedacht, dass ich immer die .hashCode() Funktion nehme und damit den unique hashkey erstelle.

Was aber, wenn mein Autoobject und mein Integer, welche ich beide in meine hashmap lege will, per .hashCode() den gleichen key produzieren?
Kann hashmap damit umgehen oder wie werden da collisions behandelt?

Viele Grüße

Tobi
 

Der Müde Joe

Top Contributor
Hash

>Gehen mir Daten verloren oder wird die HashMap automatisch vergrößert?
Java:
    void resize(int newCapacity) {
        Entry[] oldTable = table;
        int oldCapacity = oldTable.length;
        if (oldCapacity == MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return;
        }

        Entry[] newTable = new Entry[newCapacity];
        transfer(newTable);
        table = newTable;
        threshold = (int)(newCapacity * loadFactor);
    }
 

FArt

Top Contributor
Habe mir gedacht, dass ich immer die .hashCode() Funktion nehme und damit den unique hashkey erstelle.

Das ist unnötig. Der Hash wird ja nur genommen, um das Objekt schnell zu finden. Für den Vergleich wird aber immer equals verwendet. Somit sind verschiedene Objekte (gleichen oder verschiedenen Typs) mit gleichem Hash immer ungleich.
 

tobiw

Neues Mitglied
Hallo und vielen Dank für die schnellen Antworten.
Das letzte Kommentar hat mich etwas verwirrt.
Ich hatte mir das ganze ungefähr so vorgestellt.
Ist der Ansatz falsch?

Java:
public class DataStore extends HashMap<Integer, Object> implements DataStoreInterface{
	public DataStore(Integer length){
		super(length);
	}

	public void add(Object objectForInsertion) {
		//retrieve an object if there is one for the current key
		Object objectInHashMap = get(objectForInsertion.hashCode());
		
		if(objectInHashMap!=null && objectInHashMap.equals(objectForInsertion)){
			//do nothing, the same object is already in the hashmap
			
		}else if(objectInHashMap!=null && !objectInHashMap.equals(objectForInsertion)){
			//there is an object in the current position with the same hashkey,  
			//but it is not the same object that I try to insert (what now?)
			
		}else{
			//there is nothing in there, simply add the new object
			put(objectForInsertion.hashCode(),objectForInsertion);
			
		}
		
	}
}
 
M

Marcinek

Gast
Ich glaube nicht, dass es die Intention der Übung ist, wenn man SET nachproggen will dann eine andere Klasse zu nehmen, die ähnliche Eigenschaften hat, wie sein SET, nur dass die Einträge per Definition keinen Vorgänge und keinen Nachfolger haben.

Ich denke du solltest begreifen, was ein SET ist und dies selbst implementieren. Dazu würde ich eine LinkedList implementieren, die ein Objekt nur einmal aufnimmt.

Eine LinkedList würde ich implementieren indem ich ein Objekt habe, was auf einen Nachfolger zeig. Also ganz plain.

Gruß,

Marcinek
 
G

Gelöschtes Mitglied 5909

Gast
@Marcinek:
Ein Set bzw. genauer ein HashSet ist aber etwas anderes als eine LinkedList, die ein Objekt nur einmal aufnimmt.
Und eine LinkedList ist um ein vielfaches langsamer als ein HashSet, wenn du Set-typische operationen wie contains aufrust.

ALso am besten nochmal
smilie_les_002.gif



Bei einer LinkedList muss im schlimmsten fall über die ganze Liste iteriert werden. Bei dem HashSet wird der hash berechnet und dann ist man im normalfall schon da (wenn keine kollision vorhanden ist)


Ich würde eine ArrayList implementieren, die intern in dem Set verwendet wird (wegen den Kollisionen).

Hash modulo capacity = array-index


und da dadurch kollisionen entstehen können, verwendest du dann intern ein array von Listen

dasarray "für das hashen", die liste für die kollisionen

oder eben eine liste von listen
 
Zuletzt bearbeitet von einem Moderator:
M

Marcinek

Gast
@raiL

ich habe nochmal :rtfm: und habe das gefunden:

insel:
Die Schnittstelle Set für Mengen

Ein Set ist eine im mathematischen Sinn definierte Menge von Objekten. Wie von mathematischen Mengen bekannt, darf ein Set keine doppelten Elemente enthalten. Für zwei nicht identische Elemente e1 und e2 eines Set-Objekts liefert der Vergleich e1.equals(e2) also immer false. Genauer gesagt: Aus e1.equals(e2) folgt, dass e1 und e2 identische Objekt-referenzen sind, sich also auf dasselbe Mengenelement beziehen.

In der Aufgabenstellung hies es: Implementieren Sie ein SET. Nicht implementieren Sie ein SET mit optimalen Laufzeiten.

Selbst wenn es optimale Laufzeizeiten haben sollte, so würde sich statt eines closed hasing ein open Hashing besser eigenen, wie das Brent-Hashing. Wobei man das bei ~ 100 Elementen ehh imho vernachlässigbar ist.
 

FArt

Top Contributor
Die Oracle Implementierung eines HashSets ist die HashMap. So hätte ich es auch gemacht. Eine LinkedList ist sicher unpraktisch. Natürlich gibt es für andere Bereiche andere Sets, die von der Datenstruktur anders aufgebaut sind und auch Vorteile (und Nachteile) bieten, je nach Verwendung.

Für den TS:
Das Objekt ist sein eigener Schlüssel. Da musst du nicht künstlich einen erzeugen. Wenn das Objekt schon vorhanden ist (kann man überprüfen mit contains) dann darst du es halt nicht einfügen.
Die Hashes werden von den Objekten selber gebildet und equals wird auch von den Objekten selber geprüft. Fertig, ohne besonderen Aufwand. Objekte mit unterschiedlichen Hashes werden schnell als ungleich angenommen, Objekte mit gleichen Hashes werden halt noch auf equals geprüft. Dass hashCode() und equals() immer konsistent und sinnvoll implementiert ist, davon darf man ausgehen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
T HashMap Lsite gibt die sachen nicht aus wie gewollt. Java Basics - Anfänger-Themen 3
krgewb HashMap Java Basics - Anfänger-Themen 2
B Hashmap richtig bauen, die Tripel auf Zahl abbildet? Java Basics - Anfänger-Themen 10
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
berserkerdq2 Hashmap, wie prüfe ich ob ein Key schon existiert Java Basics - Anfänger-Themen 19
S Durch HashMap iterieren Java Basics - Anfänger-Themen 8
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
F gson mit einer Hashmap Java Basics - Anfänger-Themen 2
J JSON-HashMap Java Basics - Anfänger-Themen 3
J Hashmap Java Basics - Anfänger-Themen 13
C Hashmap zickt Java Basics - Anfänger-Themen 9
S HashMap contains() Methode Java Basics - Anfänger-Themen 1
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
P Verschachtelte Hashmap Java Basics - Anfänger-Themen 6
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
B HashMap alphabetisch sortieren Java Basics - Anfänger-Themen 2
J HashMap Java Basics - Anfänger-Themen 6
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
U Hashmap Iterator selbst implementieren Java Basics - Anfänger-Themen 10
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
K Value eines HashMaps in einer HashMap wiedergeben. Java Basics - Anfänger-Themen 5
O Hashmap, ArrayList, LinkedList Java Basics - Anfänger-Themen 7
O HashMap - ArrayList Java Basics - Anfänger-Themen 29
J Hashmap langsamer als compareTo? Java Basics - Anfänger-Themen 23
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
N Methoden HashMap interne Werte miteinander vergleichen Java Basics - Anfänger-Themen 7
W The type Long is not visible HashMap Java Basics - Anfänger-Themen 4
M Objekt mit Hashmap vergleichen Java Basics - Anfänger-Themen 22
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
J Hashmap auslesen Java Basics - Anfänger-Themen 7
F HashMap sortieren <String, Long> Java Basics - Anfänger-Themen 3
GreenTeaYT HashMap dupliziert meine Elemente? Java Basics - Anfänger-Themen 2
shiroX Methoden Morse-Code Übersetzer mit HashMap Java Basics - Anfänger-Themen 5
E HashMap Problem Java Basics - Anfänger-Themen 5
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
T HashMap und die Methoden Java Basics - Anfänger-Themen 13
N Methoden Interaktives PDF mit HashMap befüllen Java Basics - Anfänger-Themen 0
Z Hashmap auseinandernehmen und analysieren Java Basics - Anfänger-Themen 7
B Durchlaufen von Hashmap und Arraylist Java Basics - Anfänger-Themen 8
F HashMap oder welches Array? Java Basics - Anfänger-Themen 4
T HashMap Java Basics - Anfänger-Themen 24
L Hashmap mit variablem Key Java Basics - Anfänger-Themen 9
M Collections Probleme mit Hashmap Java Basics - Anfänger-Themen 4
N Collections String in HashMap umwandeln Java Basics - Anfänger-Themen 3
Z HashMap richtig benutzen Java Basics - Anfänger-Themen 2
lgund HashMap // TS3 Query Java Basics - Anfänger-Themen 7
Z Hashmap Iterator löscht nicht Java Basics - Anfänger-Themen 8
E Hashmap Wert auslesen Java Basics - Anfänger-Themen 2
S Printstream für einen Hashmap Loop Java Basics - Anfänger-Themen 1
dat_vin OOP Hashmap und Attribute Java Basics - Anfänger-Themen 7
C Check ob eine HashMap schon existiert Java Basics - Anfänger-Themen 16
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
R Hashmap in anderer Klasse nicht benutzbar Java Basics - Anfänger-Themen 1
T Java Hashmap Java Basics - Anfänger-Themen 3
L Gibt es etwas wie "HashMap <String, String, String> Java Basics - Anfänger-Themen 9
K HashMap mit Daten aus ArrayList befüllen Java Basics - Anfänger-Themen 14
S OOP Klasse mit static-Eigenschaften - HashMap füllen Java Basics - Anfänger-Themen 6
O HashMap Fragen Java Basics - Anfänger-Themen 8
T HashMap Werte einfügen, durchsuchen und auslesen Java Basics - Anfänger-Themen 17
M Semantisches Problem HashMap/Netzwerk Java Basics - Anfänger-Themen 4
D HashMap Keys durchlaufen Java Basics - Anfänger-Themen 2
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
M HashMap keys ausgeben Java Basics - Anfänger-Themen 2
S In einer Hashmap Klassen regestrieren Java Basics - Anfänger-Themen 2
H Collections Was ist schneller - HashMap + Sort v TreeMap? Java Basics - Anfänger-Themen 75
F HashMap nach kleinstem Value durchsuchen Java Basics - Anfänger-Themen 11
G HashMap Java Basics - Anfänger-Themen 6
F Wortpaare - HashMap - ArrayList Java Basics - Anfänger-Themen 6
M HashMap Frage Java Basics - Anfänger-Themen 3
M HashMap - put() reagiert nicht? Java Basics - Anfänger-Themen 8
N Cast eines Objektes in eine Hashmap Java Basics - Anfänger-Themen 13
A CSV Zeilenweise einlesen und in einer HashMap speichern Java Basics - Anfänger-Themen 12
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
K HashMap auf leere Key-Value-Paare prüfen Java Basics - Anfänger-Themen 14
F Hilfe bei der HashMap. Java Basics - Anfänger-Themen 3
F HashMap vs. TreeMap Java Basics - Anfänger-Themen 5
B HashMap Java Basics - Anfänger-Themen 9
C Collections String[] als value in HashMap Java Basics - Anfänger-Themen 6
V Hashmap Iterieren Java Basics - Anfänger-Themen 4
C Csv File in Hashmap ausgeben Java Basics - Anfänger-Themen 14
T HashMap<String,Object> Werte auslesen Java Basics - Anfänger-Themen 5
I HashMap sortieren Java Basics - Anfänger-Themen 10
I HashMap Java Basics - Anfänger-Themen 11
H Collections Brauche modifizierte HashMap Java Basics - Anfänger-Themen 6
H TreeMap/HashMap synchronisieren Java Basics - Anfänger-Themen 2
A Datentypen Hashmap to Array Java Basics - Anfänger-Themen 11
D HashMap überschreibt Werte Java Basics - Anfänger-Themen 7
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
D erweiterte hashmap Java Basics - Anfänger-Themen 5
H HashMap<Int, String> - Er findet die Int-Klasse nicht. Java Basics - Anfänger-Themen 3
L HashMap zu JList Java Basics - Anfänger-Themen 6
S Erste Schritte HashMap Kurze Frage - Werte über Schleife ausgeben Java Basics - Anfänger-Themen 30
F Collections ArrayList oder Hashmap mittel Collections.sychronised Java Basics - Anfänger-Themen 6
B Klassen HashMap Zwei Objekte, gleicher Key Java Basics - Anfänger-Themen 4
N HashMap fehlerhafte Rückgabe Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben