首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中高效地存储一组元组/对

如何在Java中高效地存储一组元组/对
EN

Stack Overflow用户
提问于 2018-09-28 04:05:27
回答 2查看 1.7K关注 0票数 1

我需要检查一下,在应用程序的一个非常关键的性能部分中,是否已经看到过长值和整数值的组合。这两个值都可以变得非常大,至少long在某些情况下会使用比MAX_INT值更多的值。

目前我有一个使用Set<Pair<Integer, Long>>的非常简单的实现,然而这将需要太多的分配,因为即使对象已经在集合中,像seen.add(Pair.of(i, l))这样的添加/检查存在的东西也会为每个调用分配对。

在Java语言中有没有更好的方法(没有像Guava、Trove或Apache Commons这样的库),用最少的资源和良好的O(?)来做这项检查

两个整型数很容易,因为我可以在集合中将它们组合成一个长整型,但在这里无法避免长整型。

有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2018-09-28 04:11:34

创建一个包含两个原语的类怎么样?在64位JVM中,仅为了IntegerLong的标头,您至少需要删除24 bytes

在这种情况下,您正在寻找一个Pairing Function,或者从两个数字中生成一个唯一的数字。wikipeia页面有一个很好的例子(也很简单)就是这样一种可能性。

票数 1
EN

Stack Overflow用户

发布于 2018-09-28 04:36:56

怎么样

代码语言:javascript
复制
class Pair {
    int v1;
    long v2;

    @Override
    public boolean equals(Object o) {
        return v1 == ((Pair) o).v1 && v2 == ((Pair) o).v2;
    }

    @Override
    public int hashCode() {
        return 31 * (31 + Integer.hashCode(v1)) + Long.hashCode(v2);
    }
}

class Store {
    // initial capacity should be tweaked
    private static final Set<Pair> store = new HashSet<>(100*1024);
    private static final ThreadLocal<Pair> threadPairUsedForContains = new ThreadLocal<>();

    void init() { // each thread has to call init() first
        threadPairUsedForContains.set(new Pair());
    }

    boolean contains(int v1, long v2) { // zero allocation contains()
        Pair pair = threadPairUsedForContains.get();
        pair.v1 = v1;
        pair.v2 = v2;
        return store.contains(pair);
    }

    void add(int v1, long v2) {
        Pair pair = new Pair();
        pair.v1 = v1;
        pair.v2 = v2;
        store.add(pair);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52544373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档