You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求推荐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,提问作者李志博

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:48:23