数组
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引用没有指向实体,却在操作实体中的元素时。
这两种异常能通过编译。