Merge pull request #78 from a610569731/main

fix indexOfNearestCeilingKey hashCode <0 and  comfortableCapacity size optimize
This commit is contained in:
凌星
2023-11-09 15:43:38 +08:00
committed by GitHub
3 changed files with 24 additions and 3 deletions
@@ -93,6 +93,9 @@ public class FastTreeMapIntLong {
var size = keys.length;
// 目标数小于或等于数组的第一个元素
if(key < 0){
key = Math.abs(key);
}
if (key <= keys[0]) {
return 0;
}
@@ -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) {
@@ -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));
}
}