我需要检查一下,在应用程序的一个非常关键的性能部分中,是否已经看到过长值和整数值的组合。这两个值都可以变得非常大,至少long在某些情况下会使用比MAX_INT值更多的值。
目前我有一个使用Set<Pair<Integer, Long>>
的非常简单的实现,然而这将需要太多的分配,因为即使对象已经在集合中,像seen.add(Pair.of(i, l))
这样的添加/检查存在的东西也会为每个调用分配对。
在Java语言中有没有更好的方法(没有像Guava、Trove或Apache Commons这样的库),用最少的资源和良好的O(?)
来做这项检查
两个整型数很容易,因为我可以在集合中将它们组合成一个长整型,但在这里无法避免长整型。
有什么建议吗?
发布于 2018-09-28 04:11:34
创建一个包含两个原语的类怎么样?在64位JVM中,仅为了Integer
和Long
的标头,您至少需要删除24 bytes
。
在这种情况下,您正在寻找一个Pairing Function,或者从两个数字中生成一个唯一的数字。wikipeia页面有一个很好的例子(也很简单)就是这样一种可能性。
发布于 2018-09-28 04:36:56
怎么样
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);
}
}
https://stackoverflow.com/questions/52544373
复制相似问题