gpt4 book ai didi

java - Guava 缓存的复杂键(移位)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:42:20 40 4
gpt4 key购买 nike

我有一个点对象:

  class Point {
final int x,y;
...
}

因为这些点将在我的代码中到处使用/创建,所以我想开始使用 guavas 缓存。不幸的是 CacheLoader 只接受一个参数。 Another question在 stackoverflow 上使用一对对象来解决类似的问题。但我不喜欢为每个缓存请求创建虚拟对象的想法。所以我想出了自己的解决方法:

因为对象是由 x 和 y 指定的,所以我想我可以将两个值合并(移位)到一个 long 中,这将是我的键。

void test(int x, int y) {
Long key = (long) ((long) (x) << Integer.SIZE | y);
Point point = cache.get(key);
}

CacheLoader<Long, Point> loader = new CacheLoader<Long, Point>() {
public Point load(Long key) throws Exception {
final int x,y;
// shift magic
x = (int) (key >> Integer.SIZE);
y = key.intValue();
return new Point(x, y);
}
};

我实际上是一个轮类菜鸟。这行得通吗?我错过了什么?这比配对类(class)“更快”吗?这是我的问题!

是的,我测试了代码,据我所知它是有效的。

最佳答案

这个怎么样?您的 Point 类必须正确实现 equals()hashcode()

static class Points {
static final Interner<Point> INTERNER = Interners.newStrongInterner();

public static Point cached(final int x, final int y) {
return INTERNER.intern(new Point(x, y));
}
}

您的实际目的是缓存相同的对象,对吗?这将满足您的需求。用法:

Point center = Points.cached(0, 0);

或者您的缓存示例的调整版本:

CacheLoader<Point, Point> loader = new CacheLoader<Point, Point>() {
@Override
public Point load(final Point point) {
return point;
}
}
...
Point center = cache.get(new Point(0, 0));

关于java - Guava 缓存的复杂键(移位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8240833/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com