2017-12-07 2 views
5

In Java LinkedHashSet mit Unterstützung HashSet Erstellen LinkedHashMap mit folgenden LinkedHashMap KonstruktorWarum LinkedHashSet boolean accessOrder hat auf false gesetzt

map = new LinkedHashMap<>(initialCapacity, loadFactor); 

Jetzt in LinkedHashMap, die oben Konstruktor ruft wiederum

public LinkedHashMap(int initialCapacity, float loadFactor) { 
    super(initialCapacity, loadFactor); 
    accessOrder = false; 
} 

so erstellt wird Gibt es eine Möglichkeit, ein LinkedHashSet mit accessOrder auf true gesetzt zu haben? Dies kann helfen, eine LRU-Cache-Implementierung mit LinkedHashSet zu erstellen.

+0

Ich frage nach LinkedHashSet. – Jyotirup

+0

Der Standard ist in der Tat die Reihenfolge der _insertion_, nicht der Zugriff. Wie bei der Karte kann 'put' einen vorherigen Eintrag überschreiben, daher ist die Reihenfolge von _access_ wichtiger - denke ich. –

+0

Wenn alles andere fehlschlägt, verwenden Sie Reflexion;) – Marvin

Antwort

0

Wie Sie aus dem Quellcode sehen können, wird eine LinkedHashSet von einer LinkedHashMap mit der AccessOrder auf false unterstützt.

Darüber hinaus gibt es keinen öffentlichen Konstruktor für LinkedHashSet, um die Zugriffsreihenfolge von Anzeigenauftrag zu Zugriffsreihenfolge zu ändern.

Sie könnten versuchen, diese (nur ein Beispiel):

LinkedHashSet<E> set = (LinkedHashSet<E>) Collections.newSetFromMap(new LinkedHashMap<>(16, 0.75f, true)); 
+0

OP möchte ein 'LinkedHashSet' erstellen – Lino

+0

Ich möchte ein Objekt von LinkedHashSet nicht LinkedHashMap erstellen – Jyotirup

+0

vereinbart, daher die Frage, ob es einen Hack zum Erstellen von LRU-Cache mit LinkedHashSet in Java gibt – Jyotirup

4

LinkedHashSet keinen Zugriff, um nicht unterstützt, da Sie nicht Elemente eines LinkedHashSet erreichbar.

Sie fügen Elemente zu LinkedHashSet hinzu, und Sie können sie in Anzeigenreihenfolge durchlaufen.

Wenn Sie überprüfen, ob ein Element ein Mitglied der LinkedHashSet ist, greifen Sie nicht darauf zu. Sie überprüfen die Mitgliedschaft über boolean contains(Object o), Anrufe map.containsKey(o) für die Backing Map. containsKey() hat jedoch keinen Einfluss auf die Zugriffsreihenfolge des Map.

Auf der anderen Seite, die get(Object key) Methode von.betrifft Zugriffsreihenfolge, aber es wird nie von LinkedHashSet verwendet.

Verwandte Themen