您的代码中没有自动装箱。事实上,鉴于:
public static void requireInRange(int index, Object[] array) {
...
}
int[] anArray = {3, 4, 2};
requireInRange(3, anArray); // DOES NOT COMPILE!!!
虽然 anint
可以自动装箱为Integer
,但 anint[]
不会被 Java自动装箱Integer[]
。您可以编写库函数来执行此操作,但语言不会促进这种转换。
这实际上是许多关于例如Arrays.asList(anIntArray)
“损坏”的混淆的根源,因为不是返回 a List<Integer>
,而是返回的实际上是一个 one-element List<int[]>
。
但是性能呢???
引用Java 语言指南/自动装箱:
对于科学计算或其他对性能敏感的数字代码,不适合使用自动装箱和拆箱。AnInteger
不能替代int
; 自动装箱和拆箱模糊了原始类型和引用类型之间的区别,但它们并没有消除它。
简而言之,每当自动装箱发生时,性能肯定会受到一点影响。某些事情有助于缓解这种情况,例如这些类型中内置的缓存机制。这就是您得到以下结果的原因:
System.out.println(
((Integer) 0) == ((Integer) 0)
);
// true
System.out.println(
((Integer) 10000) == ((Integer) 10000)
);
// false (implementation-specific)
这里发生的情况是,当0
被自动装箱时,实际上并没有创建新的实例:为了自动装箱的目的, 缓存了特定范围内的值,以提高性能。在大多数实现中可能超出此范围,但某些 JVM 实现确实允许您在必要时指定缓存范围。Integer
10000
但我只想得到数组的长度!!!
有很多方法可以帮助您requireInRange
使用任何类型的数组。不幸的是,使用 Java 的原语数组通常意味着大量的重复。int[]
这意味着分别为, boolean[]
, byte[]
,Object[]
等提供重载。
更简洁的选择是使用反射,但这有其优点和缺点。一般来说,反射不应该是大多数场景的首选解决方案。
话虽如此,java.lang.reflect.Array
确实有一个方法可以返回任何数组的长度。它不是类型安全的(就像大多数反射机制一样);传递非数组编译,但在运行时抛出。int getLength(Object array)
static
IllegalArgumentException
相关问题