From 3d2bb1b90d934dee7cf54b63d1baf09cb3318f92 Mon Sep 17 00:00:00 2001 From: Glavo Date: Mon, 27 Jan 2025 14:57:05 +0800 Subject: [PATCH] Fix MutableHashMap and MutableHashSet --- .../java/kala/collection/internal/hash/HashBase.java | 3 ++- .../kala/collection/internal/hash/HashUtils.java | 12 ------------ .../java/kala/collection/mutable/MutableHashMap.java | 12 +++++------- .../java/kala/collection/mutable/MutableHashSet.java | 9 ++++++--- 4 files changed, 13 insertions(+), 23 deletions(-) diff --git a/kala-collection/src/main/java/kala/collection/internal/hash/HashBase.java b/kala-collection/src/main/java/kala/collection/internal/hash/HashBase.java index 447c4b1f..dc49aeb4 100644 --- a/kala-collection/src/main/java/kala/collection/internal/hash/HashBase.java +++ b/kala-collection/src/main/java/kala/collection/internal/hash/HashBase.java @@ -16,6 +16,7 @@ package kala.collection.internal.hash; import kala.function.Hasher; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.Serial; @@ -42,7 +43,7 @@ public abstract class HashBase> implements Serializa protected transient int contentSize = 0; - protected HashBase(Hasher hasher, int initialCapacity, double loadFactor) { + protected HashBase(@NotNull Hasher hasher, int initialCapacity, double loadFactor) { if (initialCapacity < 0) { throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); } diff --git a/kala-collection/src/main/java/kala/collection/internal/hash/HashUtils.java b/kala-collection/src/main/java/kala/collection/internal/hash/HashUtils.java index 30db0d0b..b3675e30 100644 --- a/kala-collection/src/main/java/kala/collection/internal/hash/HashUtils.java +++ b/kala-collection/src/main/java/kala/collection/internal/hash/HashUtils.java @@ -28,16 +28,4 @@ private HashUtils() { public static int tableSizeFor(int capacity) { return Integer.min(Integer.highestOneBit(Integer.max(capacity - 1, 4)) * 2, 1 << 30); } - - public static int improveHash(int originalHash) { - return originalHash ^ (originalHash >>> 16); - } - - public static int unimproveHash(int improvedHash) { - return improveHash(improvedHash); - } - - public static int computeHash(Object o) { - return o == null ? 0 : improveHash(o.hashCode()); - } } diff --git a/kala-collection/src/main/java/kala/collection/mutable/MutableHashMap.java b/kala-collection/src/main/java/kala/collection/mutable/MutableHashMap.java index bd71ce6d..6c24bef5 100644 --- a/kala-collection/src/main/java/kala/collection/mutable/MutableHashMap.java +++ b/kala-collection/src/main/java/kala/collection/mutable/MutableHashMap.java @@ -40,8 +40,6 @@ import java.util.function.Supplier; import java.util.stream.Collector; -import static kala.collection.internal.hash.HashUtils.computeHash; - @SuppressWarnings("unchecked") @Debug.Renderer(hasChildren = "isNotEmpty()", childrenArray = "toArray()") public final class MutableHashMap extends HashBase> implements MutableMap, Cloneable, Serializable { @@ -65,15 +63,15 @@ public MutableHashMap(int initialCapacity, double loadFactor) { this(Hasher.optimizedHasher(), initialCapacity, loadFactor); } - public MutableHashMap(Hasher hasher) { + public MutableHashMap(@NotNull Hasher hasher) { this(hasher, DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); } - public MutableHashMap(Hasher hasher, int initialCapacity) { + public MutableHashMap(@NotNull Hasher hasher, int initialCapacity) { this(hasher, initialCapacity, DEFAULT_LOAD_FACTOR); } - public MutableHashMap(Hasher hasher, int initialCapacity, double loadFactor) { + public MutableHashMap(@NotNull Hasher hasher, int initialCapacity, double loadFactor) { super(hasher, initialCapacity, loadFactor); } @@ -529,7 +527,7 @@ public void set(K key, V value) { if (contentSize + 1 >= threshold) { growTable(table.length * 2); } - final int hash = computeHash(key); + final int hash = hasher.hash(key); final int idx = index(hash); set0(key, value, hash, idx); } @@ -539,7 +537,7 @@ public void set(K key, V value) { if (contentSize + 1 >= threshold) { growTable(table.length * 2); } - final int hash = computeHash(key); + final int hash = hasher.hash(key); final int idx = index(hash); return put0(key, value, hash, idx); } diff --git a/kala-collection/src/main/java/kala/collection/mutable/MutableHashSet.java b/kala-collection/src/main/java/kala/collection/mutable/MutableHashSet.java index f5b7660f..38514d61 100644 --- a/kala-collection/src/main/java/kala/collection/mutable/MutableHashSet.java +++ b/kala-collection/src/main/java/kala/collection/mutable/MutableHashSet.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.io.InvalidObjectException; +import java.io.Serial; import java.io.Serializable; import java.util.Arrays; import java.util.Iterator; @@ -34,6 +35,7 @@ @SuppressWarnings("unchecked") public final class MutableHashSet extends HashBase> implements MutableSet, Serializable { + @Serial private static final long serialVersionUID = 2267952928135789371L; private static final MutableHashSet.Factory FACTORY = new Factory<>(); @@ -236,7 +238,7 @@ private boolean add(E value, int hash) { final Node old = n; Node prev = null; while ((n != null) && n.hash <= hash) { - if (n.hash == hash && hasher.test(value, n.key)) { + if (n.hash == hash && hasher.equals(value, n.key)) { return false; } prev = n; @@ -257,12 +259,12 @@ public boolean add(E value) { if (contentSize + 1 >= threshold) { growTable(table.length * 2); } - return add(value, HashUtils.computeHash(value)); + return add(value, hasher.hash(value)); } @Override public boolean remove(Object value) { - return removeNode((E) value, HashUtils.computeHash(value)) != null; + return removeNode((E) value, hasher.hash((E) value)) != null; } //endregion @@ -331,6 +333,7 @@ private void readObject(java.io.ObjectInputStream in) } } + @Serial private void writeObject(java.io.ObjectOutputStream out) throws IOException { out.writeInt(contentSize);