🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## [数组初始化](https://lingcoder.gitee.io/onjava8/#/book/06-Housekeeping?id=%e6%95%b0%e7%bb%84%e5%88%9d%e5%a7%8b%e5%8c%96) 数组是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。数组是通过方括号下标操作符 \[\] 来定义和使用的。要定义一个数组引用,只需要在类型名加上方括号: ~~~ int[] a1; ~~~ 方括号也可放在标识符的后面,两者的含义是一样的: ~~~ int a1[]; ~~~ 这种格式符合 C 和 C++ 程序员的习惯。不过前一种格式或许更合理,毕竟它表明类型是"一个**int**型数组"。本书中采用这种格式。 编译器不允许指定数组的大小。这又把我们带回有关"引用"的问题上。你所拥有的只是对数组的一个引用(你已经为该引用分配了足够的存储空间),但是还没有给数组对象本身分配任何空间。为了给数组创建相应的存储空间,必须写初始化表达式。对于数组,初始化动作可以出现在代码的任何地方,但是也可以使用一种特殊的初始化表达式,它必须在创建数组的地方出现。这种特殊的初始化是由一对花括号括起来的值组成。这种情况下,存储空间的分配(相当于使用**new**) 将由编译器负责。例如: ~~~ int[] a1 = {1, 2, 3, 4, 5}; ~~~ 那么为什么在还没有数组的时候定义一个数组引用呢? ~~~ int[] a2; ~~~ 在 Java 中可以将一个数组赋值给另一个数组,所以可以这样: ~~~ a2 = a1; ~~~ 其实真正做的只是复制了一个引用,就像下面演示的这样: ~~~ // housekeeping/ArraysOfPrimitives.java public class ArraysOfPrimitives { public static void main(String[] args) { int[] a1 = {1, 2, 3, 4, 5}; int[] a2; a2 = a1; for (int i = 0; i < a2.length; i++) { a2[i] += 1; } for (int i = 0; i < a1.length; i++) { System.out.println("a1[" + i + "] = " + a1[i]); } } } ~~~ 输出: ~~~ a1[0] = 2; a1[1] = 3; a1[2] = 4; a1[3] = 5; a1[4] = 6; ~~~ **a1**初始化了,但是**a2**没有;这里,**a2**在后面被赋给另一个数组。由于**a1**和**a2**是相同数组的别名,因此通过**a2**所做的修改在**a1**中也能看到。 所有的数组(无论是对象数组还是基本类型数组)都有一个固定成员**length**,告诉你这个数组有多少个元素,你不能对其修改。与 C 和 C++ 类似,Java 数组计数也是从 0 开始的,所能使用的最大下标数是**length - 1**。超过这个边界,C 和 C++ 会默认接受,允许你访问所有内存,许多声名狼藉的 bug 都是由此而生。但是 Java 在你访问超出这个边界时,会报运行时错误(异常),从而避免此类问题。