数组可以做一些令人惊讶的事情。
是否是数组?
Serializable array = new Serializable[9];
数组是数组还是标量? 好吧,它是指向数组的标量。 就像
Object o = new Object[9];
您可以将数组分配给对象,因为它也是对象。 但是,数组也是可序列化的,因此您可以将它们分配给可序列化。
我的[]去了哪里?
[]可能出现在令人惊讶的地方。 出于后向可比较性原因进行编译。
public static int method(int[]... args)[] {return args[0];
}
这里的类型是; args是int [] [],返回类型是int []。 您在方法声明后注意到[]了吗? 这不是JLS的一部分,并且由于向后兼容的原因,OpenJDK允许这样做。
之后的内容有所不同。
int[] array, x[];
和
int array[], y[];
在这些情况下; x是int [] []但y只是int [] 。
如果数组初始化太大,会发生什么?
说我初始化这样的数组
public static final int[] VALUES = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,/* many, many lines deleted */1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
};
错误消息是;
Error:(6, 31) java: code too large
这似乎有点奇怪。 它不会抱怨数组太大。 实际上,如果我有更多的静态字段或使用较大的常量,则对于较小的数组它将失败。
发生这种情况是因为数组是用字节码初始化的。 字节码创建数组并初始化每个值,一次初始化一个。 这会导致大量用于大型数组的代码,如果方法的大小没有限制,这将是一个问题。 即65535字节。 编译器只为构造函数或静态初始化生成一种方法,因此这限制了您可以拥有的枚举数和初始化数组的大小。
翻译自: https://www.javacodegeeks.com/2014/04/java-arrays-wat.html