ConcurrentHashMap 构造器为啥要这么处理?
資深大佬 : amiwrong123 7
public ConcurrentHashMap(int initialCapacity) { if (initialCapacity < 0) throw new IllegalArgumentException(); int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ? MAXIMUM_CAPACITY : tableSizeFor(initialCapacity + (initialCapacity >>> 1) + 1)); this.sizeCtl = cap; }
tableSizeFor 的道理我都懂,这和 hashmap 一样,但这里为啥不是直接传递 initialCapacity 给 tableSizeFor 呢?
我把两种情况对比了一下,发现好像也没啥规律啊?
1 ==> 1 1 ==> 2 ==> 2 2 ==> 2 2 ==> 4 ==> 4 3 ==> 4 3 ==> 5 ==> 8 4 ==> 4 4 ==> 7 ==> 8 5 ==> 8 5 ==> 8 ==> 8 6 ==> 8 6 ==> 10 ==> 16 7 ==> 8 7 ==> 11 ==> 16 8 ==> 8 8 ==> 13 ==> 16 9 ==> 16 9 ==> 14 ==> 16 10 ==> 16 10 ==> 16 ==> 16 11 ==> 16 11 ==> 17 ==> 32 12 ==> 16 12 ==> 19 ==> 32 13 ==> 16 13 ==> 20 ==> 32 14 ==> 16 14 ==> 22 ==> 32 15 ==> 16 15 ==> 23 ==> 32 16 ==> 16 16 ==> 25 ==> 32 17 ==> 32 17 ==> 26 ==> 32 18 ==> 32 18 ==> 28 ==> 32 19 ==> 32 19 ==> 29 ==> 32 20 ==> 32 20 ==> 31 ==> 32 21 ==> 32 21 ==> 32 ==> 32 22 ==> 32 22 ==> 34 ==> 64 23 ==> 32 23 ==> 35 ==> 64 24 ==> 32 24 ==> 37 ==> 64 25 ==> 32 25 ==> 38 ==> 64 26 ==> 32 26 ==> 40 ==> 64 27 ==> 32 27 ==> 41 ==> 64 28 ==> 32 28 ==> 43 ==> 64 29 ==> 32 29 ==> 44 ==> 64 30 ==> 32 30 ==> 46 ==> 64 31 ==> 32 31 ==> 47 ==> 64 32 ==> 32 32 ==> 49 ==> 64 33 ==> 64 33 ==> 50 ==> 64 34 ==> 64 34 ==> 52 ==> 64 35 ==> 64 35 ==> 53 ==> 64 36 ==> 64 36 ==> 55 ==> 64
大佬有話說 (9)