diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/MultiDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/MultiDecoder.java index e3aae5d52..233ba1d1a 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/decoder/MultiDecoder.java +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/MultiDecoder.java @@ -15,6 +15,7 @@ */ package org.redisson.client.protocol.decoder; +import java.util.LinkedHashMap; import java.util.List; import org.redisson.client.codec.Codec; @@ -39,4 +40,11 @@ public interface MultiDecoder { T decode(List parts, State state); + static LinkedHashMap newLinkedHashMap(int expectedSize) { + if (expectedSize < 3) { + return new LinkedHashMap<>(expectedSize + 1); + } + return new LinkedHashMap<>((int) Math.ceil(expectedSize / 0.75)); + } + } diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapDecoder.java index e89dee384..04851b442 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapDecoder.java +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapDecoder.java @@ -15,7 +15,6 @@ */ package org.redisson.client.protocol.decoder; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -55,7 +54,7 @@ public class ObjectMapDecoder implements MultiDecoder { return parts; } - Map result = new LinkedHashMap<>(parts.size()/2); + Map result = MultiDecoder.newLinkedHashMap(parts.size()/2); for (int i = 0; i < parts.size(); i++) { if (i % 2 != 0) { result.put(parts.get(i-1), parts.get(i)); diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapEntryReplayDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapEntryReplayDecoder.java index fd705709e..dcce72dbd 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapEntryReplayDecoder.java +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapEntryReplayDecoder.java @@ -19,7 +19,6 @@ import org.redisson.client.codec.Codec; import org.redisson.client.handler.State; import org.redisson.client.protocol.Decoder; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -42,7 +41,7 @@ public class ObjectMapEntryReplayDecoder implements MultiDecoder> decode(List parts, State state) { - Map result = new LinkedHashMap(parts.size()/2); + Map result = MultiDecoder.newLinkedHashMap(parts.size()/2); for (int i = 0; i < parts.size(); i++) { if (i % 2 != 0) { result.put(parts.get(i-1), parts.get(i)); diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java index a79b7bef9..208e614ef 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/ObjectMapReplayDecoder.java @@ -19,7 +19,6 @@ import org.redisson.client.codec.Codec; import org.redisson.client.handler.State; import org.redisson.client.protocol.Decoder; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -58,7 +57,7 @@ public class ObjectMapReplayDecoder implements MultiDecoder> { @Override public Map decode(List parts, State state) { - Map result = new LinkedHashMap<>(parts.size()/2); + Map result = MultiDecoder.newLinkedHashMap(parts.size()/2); for (int i = 0; i < parts.size(); i++) { if (i % 2 != 0) { if (swapKeyValue) { diff --git a/redisson/src/main/java/org/redisson/client/protocol/decoder/StringMapReplayDecoder.java b/redisson/src/main/java/org/redisson/client/protocol/decoder/StringMapReplayDecoder.java index b1f1f0cb3..73e0a47e4 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/decoder/StringMapReplayDecoder.java +++ b/redisson/src/main/java/org/redisson/client/protocol/decoder/StringMapReplayDecoder.java @@ -17,7 +17,6 @@ package org.redisson.client.protocol.decoder; import org.redisson.client.handler.State; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -30,7 +29,7 @@ public class StringMapReplayDecoder implements MultiDecoder> @Override public Map decode(List parts, State state) { - Map result = new LinkedHashMap<>(parts.size()/2); + Map result = MultiDecoder.newLinkedHashMap(parts.size()/2); for (int i = 0; i < parts.size(); i++) { if (i % 2 != 0) { result.put(parts.get(i-1).toString(), parts.get(i).toString());