Java数组,Wat!

数组可以做一些令人惊讶的事情。

是否是数组?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值