概述
数组是一种数据结构,用来存储同一类型的集合。通过一个整数下标可以访问数组中的每一个值。例如,如果a是一个整型数组,a[i]就是数组中下标为i的整数。
数组声明
在声明数组变量时,需要指出数组类型(数组元素类型紧跟 [])和数组变量的名字。下面声明了整型数组a:
int[] a;
数组初始化
数组初始化有如下两种方式。
1.静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。
2.动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。
静态初始化
静态初始化语法如下:
arrayName = new type[]{element1,element2,element3……};
例如:
int[] a= new int[]{1,2,3,4,5};
其中type与显示指定的数组元素值得类型相同,或者是其子类的实例
例如:
Object[] a = new String[]{'1','2','3'};
除此之外:静态初始化还有如下简化的语法格式:
type[] arrayName = {element1,element2,element3……};
例如:
int[] a ={1,2,3,4,5};
动态初始化
在数组声明中:int[] a;
这条语句只声明了变量a,并没有将a初始化为一个真正的数组。应该用new运算符创建数组。
int[] a = new int [100];
这条语句创建了一个可以存储100个整数的数组。数组长度不要求是常量:new int[n]会创建一个长度为n的数组。
创建一个数字数组时,所有元素都初始化为0。boolean数组的元素会初始化为false。对象数组的元素则初始化为一个特殊值null,这表示这些元素还未存放任何对象。例如:
String[] names = new String[10];
会创建一个包含10个字符串的数组,所有字符串都为null。
数组拷贝
在java中,允许将一个数组变量拷贝给另一个数组变量。这时两个变量将引用同一个数组。
例如:
int[] a ={1,2,3,4,5};
int[] b =a;
b和a将引用同一个数组。
如果希望将一个数组的所有值拷贝到一个新的数组中去,就需要使用Arrays类的copyOf方法:
int[] b = Arrays.copyOf(a,a.length);
第二个参数是新数组的长度。这个方法通常用来增加数组的大小:
b=Arrays.copyOf(b,2*b.length);
如果数组元素是数值型,那么多余的元素将被赋值为0;如果数组元素是布尔型,则将赋值为false。相反,如果长度小于原始数组长度,则只能拷贝最前面的数组元素。
数组排序
要想对数组进行排序,可以使用Arrays类中的sort方法。
1. 数字排序 int[] intArray = new int[] { 4, 1, 3, -23 };
Arrays.sort(intArray);
输出: [-23, 1, 3, 4]
2. 字符串排序,先大写后小写 String[] strArray = new String[] { "z", "a", "C" };
Arrays.sort(strArray);
输出: [C, a, z] //按照ASCII的升序排序。
3. 严格按字母表顺序排序,也就是忽略大小写排序 Case-insensitive sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
输出: [a, C, z]
4. 反向排序, Reverse-order sort 按照ASCII的降序排序。
Arrays.sort(strArray, Collections.reverseOrder());
输出:[z, a, C]
5. 忽略大小写反向排序 Case-insensitive reverse-order sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
Collections.reverse(Arrays.asList(strArray));
输出: [z, C, a]
数组越界异常
如果创建了一个100个元素的数组,并且试图访问a[100](或者任何在0~99之外的下标),程序就会引发“array index out of bounds”异常而终止执行。
我们可以使用try catch捕获这种异常:
public static void main(String args[]){
String[] str={"1","2"};
try {
System.out.println(str[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界");
}
}
要想获取数组中元素个数,可以使用 a.length。例如:
for(int i=0;i<a.length;i++)
System.out.println(a[i]);
上面的代码打印出了a数组的所有元素,还有个更加简单的方式。要想打印数组,可以调用Arrays类的toString方法。
例如上面的代码可以改为:
System.out.println(Arrays.toString(a));
补充说明
一旦创建了数组,就不能再改变它的大小。如果经常需要在运行过程中扩展数组的大小,就应该使用另一种数据结构---数组列表(array list)后文中会有介绍。