我正在编写一个程序来解决Project Euler的第14个问题。这是我得到的内容:
private static final int INITIAL_CACHE_SIZE = 30000;
private static Map<Long, Integer> cache = new HashMap<Long, Integer>(INITIAL_CACHE_SIZE);
public void main(String... args) {
long number = 0;
int maxSize = 0;
for (long i = 1; i <= TARGET; i++) {
int size = size(i);
if (size > maxSize) {
maxSize = size;
number = i;
}
}
}
private static int size(long i) {
if (i == 1L) {
return 1;
}
final int size = size(process(i)) + 1;
return size;
}
private static long process(long n) {
return n % 2 == 0 ? n/2 : 3*n + 1;
}
这个代码可以正常运行,使用 1 000 000 的 TARGET 大约需要 5 秒完成。
我想通过添加缓存来进行优化,所以我将 size 方法更改为以下内容:
private static int size(long i) {
if (i == 1L) {
return 1;
}
if (cache.containsKey(i)) {
return cache.get(i);
}
final int size = size(process(i)) + 1;
cache.put(i, size);
return size;
}
现在当我运行它时,每次到达555144时程序就会停止(进程退出)。没有抛出任何异常、错误、Java VM崩溃或其他任何东西。
更改缓存大小似乎也没有任何效果,那么缓存引入如何导致此错误?
如果我强制缓存大小不仅是初始值,而且是永久的,像这样:
if (i < CACHE_SIZE) {
cache.put(i, size);
}
这个错误不再出现了。 编辑:当我将缓存大小设置为2M时,该错误再次出现。
有人能够重现这个问题,并且提供一些可能发生的原因吗?