diff --git a/gson/src/main/java/com/google/gson/internal/bind/EnumTypeAdapter.java b/gson/src/main/java/com/google/gson/internal/bind/EnumTypeAdapter.java index 5f24dc18d9..b3dbb680c1 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/EnumTypeAdapter.java +++ b/gson/src/main/java/com/google/gson/internal/bind/EnumTypeAdapter.java @@ -50,9 +50,16 @@ public TypeAdapter create(Gson gson, TypeToken typeToken) { } }; - private final Map nameToConstant = new HashMap<>(); - private final Map stringToConstant = new HashMap<>(); - private final Map constantToName = new HashMap<>(); + /** + * Taken from Java 19 method {@link HashMap.newHashMap}, using default load factor {@code 0.75F}. + */ + private static int calculateHashMapCapacity(int numMappings) { + return (int) Math.ceil(numMappings / 0.75F); + } + + private final Map nameToConstant; + private final Map stringToConstant; + private final Map constantToName; private EnumTypeAdapter(Class classOfT) { try { @@ -71,6 +78,12 @@ private EnumTypeAdapter(Class classOfT) { // one declared field which is not an enum constant, namely the implicit $VALUES array fields = Arrays.copyOf(fields, constantCount); + int hashMapCapacity = calculateHashMapCapacity(constantCount); + nameToConstant = new HashMap<>(hashMapCapacity); + stringToConstant = new HashMap<>(hashMapCapacity); + // Don't use `EnumMap` here; that can break when using ProGuard or R8 + constantToName = new HashMap<>(hashMapCapacity); + AccessibleObject.setAccessible(fields, true); for (Field constantField : fields) {