diff --git a/net/src/main/java/com/zfoo/net/util/FastTreeMapIntLong.java b/net/src/main/java/com/zfoo/net/util/FastTreeMapIntLong.java index fc7e3d66..2e5fc5ee 100644 --- a/net/src/main/java/com/zfoo/net/util/FastTreeMapIntLong.java +++ b/net/src/main/java/com/zfoo/net/util/FastTreeMapIntLong.java @@ -93,6 +93,9 @@ public class FastTreeMapIntLong { var size = keys.length; // 目标数小于或等于数组的第一个元素 + if(key < 0){ + key = Math.abs(key); + } if (key <= keys[0]) { return 0; } diff --git a/protocol/src/main/java/com/zfoo/protocol/collection/CollectionUtils.java b/protocol/src/main/java/com/zfoo/protocol/collection/CollectionUtils.java index 35ec1246..29466166 100644 --- a/protocol/src/main/java/com/zfoo/protocol/collection/CollectionUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/collection/CollectionUtils.java @@ -16,6 +16,7 @@ package com.zfoo.protocol.collection; import com.zfoo.protocol.model.Pair; import com.zfoo.protocol.util.AssertionUtils; import com.zfoo.protocol.util.IOUtils; +import com.zfoo.protocol.util.MathSafeUtil; import com.zfoo.protocol.util.StringUtils; import java.util.*; @@ -115,9 +116,7 @@ public abstract class CollectionUtils { * CN: 计算HashMap初始化合适的大小,为了安全必须给初始化的集合一个最大上限,防止反序列化一个不合法的包导致内存突然升高 */ public static int comfortableCapacity(int capacity) { - return capacity < 16 - ? (capacity < 8 ? 16 : 32) - : (capacity < 32 ? 64 : Math.min(capacity << 1, IOUtils.BYTES_PER_MB)); + return MathSafeUtil.safeFindNextPositivePowerOfTwo(capacity); } public static int capacity(int expectedSize) { diff --git a/protocol/src/main/java/com/zfoo/protocol/util/MathSafeUtil.java b/protocol/src/main/java/com/zfoo/protocol/util/MathSafeUtil.java new file mode 100644 index 00000000..04120c8d --- /dev/null +++ b/protocol/src/main/java/com/zfoo/protocol/util/MathSafeUtil.java @@ -0,0 +1,19 @@ +package com.zfoo.protocol.util; + +/** + * @author Boone Jack + */ +public class MathSafeUtil { + private MathSafeUtil() { + } + + public static int findNextPositivePowerOfTwo(int value) { + assert value > Integer.MIN_VALUE && value < IOUtils.BYTES_PER_MB; + + return 1 << 32 - Integer.numberOfLeadingZeros(value - 1); + } + + public static int safeFindNextPositivePowerOfTwo(int value) { + return value <= 0 ? 1 : (value >= IOUtils.BYTES_PER_MB ? IOUtils.BYTES_PER_MB : findNextPositivePowerOfTwo(value)); + } +}