我有一个Map,它将被多个线程同时修改.
Java API中似乎有三种不同的同步Map实现:
HashtableCollections.synchronizedMap(Map)ConcurrentHashMap据我所知,这Hashtable是一个旧的实现(扩展过时的Dictionary类),后来经过调整以适应Map界面.虽然它是同步的,但似乎存在严重的可扩展性问题,并且不鼓励新项目.
但是其他两个怎么样?返回的地图Collections.synchronizedMap(Map)和ConcurrentHashMaps 之间有什么区别?哪一种适合哪种情况?
我理解Big-O表示法,但我不知道如何为许多函数计算它.特别是,我一直试图弄清楚Fibonacci序列的幼稚版本的计算复杂性:
int Fibonacci(int n)
{
if (n <= 1)
return n;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
Run Code Online (Sandbox Code Playgroud)
Fibonacci序列的计算复杂度是多少以及如何计算?
前段时间,我发表了一篇关于递归计算斐波纳契数的Java 8函数式方法的博文,其中包含一个ConcurrentHashMap缓存和新的有用computeIfAbsent()方法:
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class Test {
static Map<Integer, Integer> cache = new ConcurrentHashMap<>();
public static void main(String[] args) {
System.out.println(
"f(" + 8 + ") = " + fibonacci(8));
}
static int fibonacci(int i) {
if (i == 0)
return i;
if (i == 1)
return 1;
return cache.computeIfAbsent(i, (key) -> {
System.out.println(
"Slow calculation of " + key);
return fibonacci(i - 2) + fibonacci(i - 1);
});
}
} …Run Code Online (Sandbox Code Playgroud)