我现在正在使用JCreator。我说得对不对;在不使用的数组元素中自动设置“零”值的原因是什么?这类似于编译器的优化还是由JVM引起的?
答案 0 :(得分:6)
数组元素不不可能有一个值,因此必须选择一个,对于数值类型,零是明显的默认值。
更具体地说:当你读取“不使用”的数组位置时,你认为应该返回什么?
答案 1 :(得分:4)
如JLS Section 15.10中所述,我引用
然后,如果出现单个DimExpr,则创建具有指定长度的一维数组,并将该数组的每个组件初始化为其默认值
其中基本类型的默认值(即类变量,实例变量或数组组件)记录在JLS Section 4.5.5中,对于数字基元为0,对于布尔值为false
,{ {1}}用于参考类型。
答案 2 :(得分:1)
不使用数组元素,因此它们包含的值无关紧要。重要的是当你实例化一个新的数组(整数)时,它的所有元素都被初始化为0.这比它们被初始化为任意值更容易使用和更安全,因为大多数时候,当你创建它时一个数组,要么你明确地初始化每个元素,默认值无关紧要,要么你没有,因为你们都希望它们为0。
答案 3 :(得分:0)
Java数组是一个对象。当您为原始类型创建数组(即分配内存)时,它将使用其默认值创建n
元素或变量。但是在reference
(非原始)类型的情况下,它将创建该类型的n
元素(引用变量),其初始值为null
。
答案 4 :(得分:0)
这是C的日子里的延续。如果你是一个疲惫不堪的开发人员调试一百万行程序,你宁愿检查一个阵列,并想知道你是否把这些神秘的价值放入其中,或者更加保证数组尚未填充,因为它中有“默认值”?
答案 5 :(得分:0)
我说得对不对;在不使用的数组元素中自动设置“零”值的原因是什么?
它是Java语言规范的一部分。 Java设计者认为,未经显式初始化(由程序)的数组元素最好仍以可预测的值开始。更好的原因是它使程序的行为更具可预测性。
零的选择在某种程度上是任意的,但零确实是一个明显的选择。
(请注意,对于对象数组,null
以外的任何值都将被解释为作为某个对象的引用。随机未初始化的内存字指向有效的可能性对象(更不用说,一个正确的类型)非常小。如果没有,你只需要对Java类型进行安全保护。)
这类似于编译器的优化还是由JVM引起的?
我怀疑这是主要原因。我想理论上可以有特殊的硬件支持来将大区域的内存(或虚拟内存)初始化为零。
答案 6 :(得分:0)
我注意到没有人提到归零的最重要部分 - 安全性和完整性考虑。
Java设计是安全的,在正常情况下,java代码可能不会使进程崩溃,或者(更糟糕的是)执行非法操作,例如读取/写入没有授予权限的文件系统。
在对象/数组创建过程中缺少任意填充可能会导致对基本like int/byte/long
的安全数据的陈旧引用。在任何时候,引用都必须处于有效状态,并且唯一真正有效的状态是null
。
归零还有其他非常重要的好处,例如完美的可预测性,并且可以在异步垃圾收集期间进行 - 无需分配成本。