数组

java中的数组和php中的数组有很大区别,java中数组存储相同类型值的序列。

数组的声明

在声明数组变量时,需要指出数组类型和数组变量的名字。如下:

int[] a;
//or
int a[];

创建数组,可以使用new方式或字面量方法。

int[] a = new int[100];
int b[] = {32,23,14,123};
String[] strArr = {
    "php",
    "java",
    "c++",
    "golan"
};

还可以声明匿名数组:

double[] dArr = new double[] {32,32.13,23.12};

注意一旦创建了数组,就不能再改变它的长度。

访问数组元素

创建一个数字数组时,所有元素的初始值都为0.boolean数组元素初始值都为false。对象数组的元素则初始化为一个特殊的值null。

String[] names = new String[10];

上述代码会创建一个包含10个字符串的数组,所有字符串都为null。如果希望这个数组包含空格,必须为元素指定空串。

for (int i = 0; i < 10; i ++) {
    names[i] = "";
}

要想获取数组元素个数,可以使用length属性。如:

names.length;

for each循环

for (val : collection) statement;

collection这一集合表达式必须是一个数组或一个实现了Iterable接口的类对象(例如ArrayList)。

public class Arr {
    public static void main (String[] args) {
        String[] names = {
            "php",
            "java",
            "c++",
            "golang"
        };

        for (String name : names) {
            System.out.println(name);
        }
    }
}

还有一个更简单的方式可以遍历数组中所有值,即利用Arrays.toString()方法。该方法经常用来调试。

System.out.println(Arrays.toString(names));

数组长度

获取数组的长度,用到length属性,注意,和String不一样,String用到length()方法。

数组拷贝

在java中,允许将一个数组变量拷贝到另一个数据变量。这时,两个变量将引用同一个数组:

int[] arr1 = arr2;
arr1[2] = 5; // now arr2[2] is also 5

如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays的copyOf方法。

int[] copyArr = Arrays.copyOf(arr1, arr1.length);

第二个参数是新数组的长度。这个方法通常用来改变数组的大小

int[] copyArr = Arrays.copyOf(arr1, arr1.length*2);

如果数组元素是数值型,那么额外的元素将被赋值为0;如果数组元素是布尔型,则将赋值为false。相反,如果长度小于原始数组的长度,就只会拷贝前面的。

命令行参数

每一个java应用程序都有一个带String[] args参数的main方法。这个参数表明main方法将接受一个字符串数组,也就是命令行上指定的参数。

public class Arr {
    public static void main (String[] args) {
        if (args.length == 1 && args[0].equals("-h")) {
            System.out.println("study java");
        }
    }
}

注意,和c以及php不同的是,args[0]不是该程序名,而是第一个给定的参数。

数组排序

对数组进行排序,可以使用Arrays.sort()方法,该方法使用了优化的快速排序算法。

int[] arrs = {32,234,345,23,435,5464,23};
Arrays.sort(arrs);
System.out.println(Arrays.toString(arrs));

注意,使用该方法排序数组后,原数组元素位置就会被改变,而不是返回一个排好序的数组。

多维数组

import java.util.Arrays;

public class Arr {
    public static void main (String[] args) {
        int[][] arrs = {
            {32,23,43,23},
            {23,45,76,32},
            {2,5,3,7}
        };

        for (int[] arr : arrs) {
            for (int n : arr) {
                System.out.print(n+" ");
            }
            System.out.println();
        }
    }
}

对于多维数组,有一个简单方法可以遍历所有值。Arrays.deepToString();

System.out.println(Arrays.deepToString(arrs));

常见异常

数组脚标越界异常(ArrayIndexOutOfBoundsException)

int[] arr = new int[2];
System.out.println(arr[2]);
System.out.println(arr[-1]);

访问到了数组中的不存在的脚标时发生。
空指针异常(NullPointerException)

int[] arr = null;
System.out.println(arr[0]);

arr引用没有指向实体,却在操作实体中的元素时。

这两种异常能通过编译。