例如,以下图像表示一个具有size的数组10。在这里,第一个元素在index处0,最后一个元素在index处9,而不是第一个元素在index处1,最后一个元素在index处10(请参见下图)。
0对于原始数值类型:byte,short,int,long,float,和double。
'\u0000'(空字符)的char类型。
false对于boolean类型。
null用于参考类型。
创建和初始化基本类型数组
int[] array1 = new int[] { 1, 2, 3 }; //使用新运算符创建一个数组,并
//数组初始化器。
int[] array2 = { 1, 2, 3 }; //数组初始化程序的快捷语法。
int[] array3 = new int[3]; //等效于{0,0,0}
int[] array4 = null; //数组本身是一个对象,所以它
//可以设置为null。
声明数组时,[]将作为类型的一部分出现在声明的开头(在类型名称之后),或者作为特定变量的声明器的一部分(在变量名称之后),或者两者都出现:
int array5[]; /* equivalent to */ int[] array5;
int a, b[], c[][]; /* equivalent to */ int a; int[] b; int[][] c;
int[] a, b[]; /* equivalent to */ int[] a; int[][] b;
int a, []b, c[][]; /* Compilation Error, because [] is not part of the type at beginning
of the declaration, rather it is before 'b'. */
//声明返回数组的方法时,适用相同的规则:
int foo()[] { ... } /* equivalent to */ int[] foo() { ... }
在下面的示例中,两个声明都是正确的,并且可以编译和运行而没有任何问题。但是,《Java编码约定》和《GoogleJava样式指南》均不建议在变量名后使用方括号来表示该表单,方括号用于标识数组类型,并应以类型名称显示。方法返回签名应使用相同的内容。
float array[]; /* and */ int foo()[] { ... } /* are discouraged */
float[] array; /* and */ int[] foo() { ... } /* are encouraged */
不鼓励使用的类型旨在容纳正在过渡的C用户,他们熟悉C的语法,该语法在变量名后带有方括号。
在Java中,可能具有size的数组0:
int[] array = new int[0]; //编译并运行良好。
int[] array2 = {}; //等效语法。
但是,由于它是一个空数组,因此无法从中读取任何元素或将其分配给它:
array[0] = 1; //引发java.lang.ArrayIndexOutOfBoundsException。
int i = array2[0]; //还抛出ArrayIndexOutOfBoundsException。
此类空数组通常可用作返回值,因此调用代码仅需担心处理数组,而不用担心null可能导致的潜在值NullPointerException。
数组的长度必须是非负整数:
int[] array = new int[-1]; //引发java.lang.NegativeArraySizeException
数组大小可以使用称为length:的公共最终字段来确定:
System.out.println(array.length); //在这种情况下打印0。
注意:array.length返回数组的实际大小,而不是分配了值的数组元素的数量,这与返回分配值的数组元素的数量不同。ArrayList.size()
创建和初始化多维数组
创建多维数组的最简单方法如下:
int[][] a = new int[2][3];
它将创建两个三长度int数组-a[0]和a[1]。这与矩形多维数组的经典C风格初始化非常相似。
您可以同时创建和初始化:
int[][] a = { {1, 2}, {3, 4}, {5, 6} };
与仅支持矩形多维数组的C不同,内部数组不必具有相同的长度,甚至不需要定义:
int[][] a = { {1}, {2, 3}, null };
在这里,a[0]是一个长度int数组,而是a[1]一个两个长度int数组,a[2]是null。这样的数组称为锯齿状数组或参差不齐的数组,即它们是数组的数组。Java中的多维数组被实现为数组的数组,即array[i][j][k]等效于((array[i])[j])[k]。与C#不同array[i,j],Java不支持该语法。
Java中的多维数组表示
来源-在Ideone上直播
创建和初始化引用类型数组
String[] array6 = new String[] { "Laurel", "Hardy" }; //用new创建一个数组
//运算符和数组初始化程序。
String[] array7 = { "Laurel", "Hardy" }; //数组的快捷语法
//初始化程序。
String[] array8 = new String[3]; //{null,null,null}
String[] array9 = null; //空值
住在伊迪欧
除了String上面显示的文字和原语之外,数组初始化的快捷方式语法也适用于规范Object类型:
Object[] array10 = { new Object(), new Object() };
由于数组是协变的,因此可以将引用类型数组初始化为子类的数组,尽管ArrayStoreException如果尝试将元素设置为除a之外的其他元素,则会抛出String:
Object[] array11 = new String[] { "foo", "bar", "baz" };
array11[1] = "qux"; //精细
array11[1] = new StringBuilder(); //引发ArrayStoreException
快捷方式语法不能用于此目的,因为快捷方式语法的隐式类型为Object[]。
使用可以使用零元素初始化数组String[]emptyArray=newString[0]。例如,当方法需要对象的运行时类型时,像这样的零长度数组用于Array从中创建Collection。
在原始类型和引用类型中,空数组初始化(例如String[]array8=newString[3])都会使用每种数据类型的默认值来初始化数组。
创建和初始化通用类型数组
在泛型类中,由于类型擦除,无法像这样初始化泛型类型的数组:
public class MyGenericClass<T> {
private T[] a;
public MyGenericClass() {
a = new T[5]; //编译时错误:通用数组创建
}
}
而是可以使用以下方法之一创建它们:(请注意,这些将生成未经检查的警告)
通过创建一个Object数组,并将其转换为通用类型:
a=(T[])newObject[5];
这是最简单的方法,但是由于基础数组仍为typeObject[],因此此方法不提供类型安全性。因此,这种创建数组的方法最好仅在通用类中使用-而不公开公开。
通过Array.newInstance与类参数一起使用:
publicMyGenericClass(Class<T>clazz){
a=(T[])Array.newInstance(clazz,5);
}
在此,T必须将的类显式传递给构造函数。的返回类型Array.newInstance始终为Object。但是,此方法比较安全,因为新创建的数组始终为typeT[],因此可以安全地外部化。
初始化后填充数组
JavaSE1.2Arrays.fill()初始化后可用于用相同的值填充数组:
Arrays.fill(array8, "abc"); // { "abc", "abc", "abc" }
住在伊迪欧
fill()也可以为数组指定范围内的每个元素分配一个值:
Arrays.fill(array8, 1, 2, "aaa"); // Placing "aaa" from index 1 to 2.
住在伊迪欧