diff --git a/jdk/src/java.base/share/classes/java/util/ImmutableCollections.java b/jdk/src/java.base/share/classes/java/util/ImmutableCollections.java index 494dce83a89..26a03e0dae6 100644 --- a/jdk/src/java.base/share/classes/java/util/ImmutableCollections.java +++ b/jdk/src/java.base/share/classes/java/util/ImmutableCollections.java @@ -53,7 +53,8 @@ class ImmutableCollections { */ static final int SALT; static { - SALT = new Random().nextInt(); + long nt = System.nanoTime(); + SALT = (int)((nt >>> 32) ^ nt); } /** No instances. */ @@ -63,7 +64,7 @@ class ImmutableCollections { * The reciprocal of load factor. Given a number of elements * to store, multiply by this factor to get the table size. */ - static final double EXPAND_FACTOR = 2.0; + static final int EXPAND_FACTOR = 2; static UnsupportedOperationException uoe() { return new UnsupportedOperationException(); } @@ -84,7 +85,14 @@ class ImmutableCollections { } static final class List0 extends AbstractImmutableList { - List0() { } + private static final List0 INSTANCE = new List0<>(); + + @SuppressWarnings("unchecked") + static List0 instance() { + return (List0) INSTANCE; + } + + private List0() { } @Override public int size() { @@ -214,7 +222,14 @@ class ImmutableCollections { } static final class Set0 extends AbstractImmutableSet { - Set0() { } + private static final Set0 INSTANCE = new Set0<>(); + + @SuppressWarnings("unchecked") + static Set0 instance() { + return (Set0) INSTANCE; + } + + private Set0() { } @Override public int size() { @@ -351,7 +366,7 @@ class ImmutableCollections { SetN(E... input) { size = input.length; // implicit nullcheck of input - elements = (E[])new Object[(int)Math.ceil(EXPAND_FACTOR * input.length)]; + elements = (E[])new Object[EXPAND_FACTOR * input.length]; for (int i = 0; i < input.length; i++) { E e = Objects.requireNonNull(input[i]); int idx = probe(e); @@ -450,7 +465,14 @@ class ImmutableCollections { } static final class Map0 extends AbstractImmutableMap { - Map0() { } + private static final Map0 INSTANCE = new Map0<>(); + + @SuppressWarnings("unchecked") + static Map0 instance() { + return (Map0) INSTANCE; + } + + private Map0() { } @Override public Set> entrySet() { @@ -529,7 +551,7 @@ class ImmutableCollections { } size = input.length >> 1; - int len = (int)Math.ceil(EXPAND_FACTOR * input.length); + int len = EXPAND_FACTOR * input.length; len = (len + 1) & ~1; // ensure table is even length table = new Object[len]; @@ -789,7 +811,7 @@ final class CollSer implements Serializable { return Set.of(array); case IMM_MAP: if (array.length == 0) { - return new ImmutableCollections.Map0<>(); + return ImmutableCollections.Map0.instance(); } else if (array.length == 2) { return new ImmutableCollections.Map1<>(array[0], array[1]); } else { diff --git a/jdk/src/java.base/share/classes/java/util/List.java b/jdk/src/java.base/share/classes/java/util/List.java index 8e97c2ea259..0f14c298805 100644 --- a/jdk/src/java.base/share/classes/java/util/List.java +++ b/jdk/src/java.base/share/classes/java/util/List.java @@ -786,7 +786,7 @@ public interface List extends Collection { * @since 9 */ static List of() { - return new ImmutableCollections.List0<>(); + return ImmutableCollections.List0.instance(); } /** @@ -1030,7 +1030,7 @@ public interface List extends Collection { Objects.requireNonNull(elements); switch (elements.length) { case 0: - return new ImmutableCollections.List0<>(); + return ImmutableCollections.List0.instance(); case 1: return new ImmutableCollections.List1<>(elements[0]); case 2: diff --git a/jdk/src/java.base/share/classes/java/util/Map.java b/jdk/src/java.base/share/classes/java/util/Map.java index d4ea203edee..b41e90dc866 100644 --- a/jdk/src/java.base/share/classes/java/util/Map.java +++ b/jdk/src/java.base/share/classes/java/util/Map.java @@ -1286,7 +1286,7 @@ public interface Map { * @since 9 */ static Map of() { - return new ImmutableCollections.Map0<>(); + return ImmutableCollections.Map0.instance(); } /** @@ -1604,7 +1604,7 @@ public interface Map { static Map ofEntries(Entry... entries) { Objects.requireNonNull(entries); if (entries.length == 0) { - return new ImmutableCollections.Map0<>(); + return ImmutableCollections.Map0.instance(); } else if (entries.length == 1) { return new ImmutableCollections.Map1<>(entries[0].getKey(), entries[0].getValue()); diff --git a/jdk/src/java.base/share/classes/java/util/Set.java b/jdk/src/java.base/share/classes/java/util/Set.java index a1911c13e1b..08ef3297161 100644 --- a/jdk/src/java.base/share/classes/java/util/Set.java +++ b/jdk/src/java.base/share/classes/java/util/Set.java @@ -448,7 +448,7 @@ public interface Set extends Collection { * @since 9 */ static Set of() { - return new ImmutableCollections.Set0<>(); + return ImmutableCollections.Set0.instance(); } /** @@ -692,7 +692,7 @@ public interface Set extends Collection { Objects.requireNonNull(elements); switch (elements.length) { case 0: - return new ImmutableCollections.Set0<>(); + return ImmutableCollections.Set0.instance(); case 1: return new ImmutableCollections.Set1<>(elements[0]); case 2: