打字猴:1.700446535e+09
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 ]  [ 下一页 ]