1700446535
1700446536
LargeConst枚举项数量:65
1700446537
1700446538
class java.util.RegularEnumSet
1700446539
1700446540
class java.util.JumboEnumSet
1700446541
1700446542
很遗憾,两者不相等。就差1个元素,两者就不相等了?确实如此,这也是我们要重点关注枚举项数量的原因。先来看看Java是如何处理的,首先跟踪allOf方法,其源代码如下:
1700446543
1700446544
public static<E extends Enum<E>>EnumSet<E>allOf(Class<E>elementType){
1700446545
1700446546
//生成一个空EnumSet
1700446547
1700446548
EnumSet<E>result=noneOf(elementType);
1700446549
1700446550
//加入所有的枚举项
1700446551
1700446552
result.addAll();
1700446553
1700446554
return result;
1700446555
1700446556
}
1700446557
1700446558
allOf通过noneOf方法首先生成一个EnumSet对象,然后把所有的枚举项都加进去,问题可能就出在EnumSet的生成上了,我们来看noneOf的代码:
1700446559
1700446560
public static<E extends Enum<E>>EnumSet<E>noneOf(Class<E>elementType){
1700446561
1700446562
//获得所有枚举项
1700446563
1700446564
Enum[]universe=getUniverse(elementType);
1700446565
1700446566
if(universe==null)
1700446567
1700446568
throw new ClassCastException(elementType+“not an enum”);
1700446569
1700446570
if(universe.length<=64)
1700446571
1700446572
//枚举数量小于等于64
1700446573
1700446574
return new RegularEnumSet<E>(elementType, universe);
1700446575
1700446576
else
1700446577
1700446578
//枚举数量大于64
1700446579
1700446580
return new JumboEnumSet<E>(elementType, universe);
1700446581
1700446582
}
1700446583
1700446584
看到这里恍然大悟,Java原来是如此处理的:当枚举项数量小于等于64时,创建一个RegularEnumSet实例对象,大于64时则创建一个JumboEnumSet实例对象。
[
上一页 ]
[ :1.700446535e+09 ]
[
下一页 ]