5.8 数组初始化
- 数组只是相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列
- 数组是通过方括号下标操作符[]来定义和使用的:
- TypeName[] ArrayName
- TypeName ArrayName[]
- 编译器不允许指定数组的大小
- 现在拥有的只是队数组的一个引用,而且也没有给数组对象本身分配任何空间.
- 为了给数组创建相应的存储空间,必须屑初始化表达式
- 初始化动作可以出现在代码的任何地方,也可以用一种特殊的初始化表达式,它必须在创建数组的地方出现
- 这种特殊的初始化是由一对花括号括起来的值组成
- Java中可以将一个数组赋值给另一个数组
//:initialization/ArrayOfPrimitives.java
public class ArrayOfPrimitives{
public static void main(String[] args) {
int[] a1={1,2,3,4,5};
//Initialize the array by copy from another array,
//It only copy a reference
int[] a2;
a2=a1;
for(int item:a2) item+=1;
for(int i=0;i<a1.length;i++)
System.out.println("a1["+i+"] = "+a1[i]);
}
}/*Output:
a1[0] = 1
a1[1] = 2
a1[2] = 3
a1[3] = 4
a1[4] = 5
*///:~
- 所有数组都有一个固定成员length,可以通过它获知数组内包含了多少个元素,但不能对其进行修改
- Java数组计数从0开始,能使用的最大下标数是length-1
- 一旦访问下标过界,就会出现运行时错误(异常)
- 如果编写程序时,并不能确定在数组里需要多少个元素,可以直接用new在数组里创建元素
-
不能用new创建单个的基本类型数据
//:initialization/ArrayNew.java //Creating arrays with new import java.util.*; public class ArrayNew{ public static void main(String[] args) { int[] a; Random random=new Random(47); a=new int[random.nextInt(20)]; System.out.println("length of a = "+a.length); System.out.println(Arrays.toString(a)); } }/**Output: length of a = 18 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] *///:~
-
数组元素中的基本数据类型会自动初始化成空值
- 数字和字符就是0
- 布尔型就是false
-
- 如果你创建了一个非基本类型的数组,那么你就创建了一个引用数组
//:initalization/ArrayCLassObj.java
//Creating an array of noprimitive objects
import java.util.*;
public class ArrayClassObj{
public static void main(String[] args) {
Random rand=new Random(47);
Integer[] a=new Integer[rand.nextInt(20)];
System.out.println("Length of a = "+ a.length);
for(int i=0;i<a.length;i++)
a[i]=rand.nextInt(500); //Autoboxing
System.out.println(Arrays.toString(a));
}
}/*Output:
Length of a = 18
[55, 193, 361, 461, 429, 368, 200, 22, 207, 288, 128, 51, 89, 309, 278, 498, 361, 20]
*///:~
- 如果忘记创建对象,并且试图使用数组中的空引用,就会在运行时产生时产生异常.
- 也可以使用花括号引起来的列表来初始化对象数组.
import java.util.Arrays;
//:initialization/ArrayInit.java
//Array initialization
public class ArrayInit{
public static void main(String[] args) {
Integer[] a={
new Integer(1),
new Integer(2),
3, //Autoboxing
};
Integer[] b=new Integer[]{
new Integer(1),
new Integer(2),
3, //Autoboxing
};
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
}
}/*Oytput:
[1, 2, 3]
[1, 2, 3]
*///:~
P.S: 可以创建一个String对象数组,将其床底给另一个main()方法,以提供参数,用来替换传递给该main()方法的命令行参数
//:initialization/DynamicArray.java
//Array initialization
public class DynamicArray{
public static void main(String[] args) {
Other.main(new String[]{"fiddle","de","dum"});
}
}
class Other{
public static void main(String[] args) {
for(String s:args)
System.out.print(s+" ");
}
}/*Output:
fiddle de dum
*/
5.5.1 可变参数列表
- 有了可变参数,就再也不用显示地编写数组语法了,当你指定参数时,编译器实际上会为你填充数组,你获得的仍是一个数组.