求推荐Java中替代Guava RangeMap的低内存数据结构
替代Guava RangeMap<Integer, String>的低内存数据结构方案
现成库方案
Eclipse Collections IntRangeMap
Eclipse Collections提供了专门针对基本类型的IntRangeMap,完全避免Integer装箱操作,内存占用远低于Guava的RangeMap<Integer, String>。它直接以int类型存储区间的起始和结束边界,内部采用紧凑的存储结构,同时支持标准的区间映射操作(如添加、删除区间,查找对应值)。
FastUtil 自定义区间映射
FastUtil以优化基本类型集合的内存占用著称,虽然没有直接提供RangeMap实现,但可以结合IntRBTreeMap(红黑树实现的int键映射)来模拟区间映射:将区间的起始点作为键,存储对应的区间信息和值,通过红黑树的前缀查找快速定位包含目标int的区间。这种方式同样避免了装箱,内存效率很高。
自定义实现(零依赖)
如果不想引入第三方库,可自行实现基于有序数组+二分查找的int区间映射,完全消除装箱开销,内存占用极低:
import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; public class IntStringRangeMap { private static class RangeEntry { final int start; final int end; final String value; RangeEntry(int start, int end, String value) { this.start = start; this.end = end; this.value = value; } } private final List<RangeEntry> sortedEntries; public IntStringRangeMap(List<RangeEntry> entries) { // 按区间起始值排序,确保区间无重叠且有序 sortedEntries = entries.stream() .sorted(Comparator.comparingInt(e -> e.start)) .collect(Collectors.toUnmodifiableList()); } public String get(int key) { int low = 0; int high = sortedEntries.size() - 1; while (low <= high) { int mid = (low + high) >>> 1; RangeEntry entry = sortedEntries.get(mid); if (key < entry.start) { high = mid - 1; } else if (key > entry.end) { low = mid + 1; } else { return entry.value; } } return null; } }
该实现适合区间数量固定、修改频率低的场景,查找时间复杂度为O(log n),内存仅存储int边界和字符串引用,没有额外装箱开销。
内容的提问来源于stack exchange,提问作者李志博
相关产品推荐
相关产品推荐

