数组是具有相同数据类型的一组数据集合,数组中的每个元素具有相同的数据类型,在Java中同样将数组看作一个对象。
数组的初始化
Java程序中的数组必须经过初始化才可以使用,并且初始化后,该数组所占的内存空间、数组长度都是不可变的。
所谓数组初始化,即创建实际的数组对象,也就是在内存中为数组对象分配内存空间,并为每个数组元素指定初始值。
数组的初始化有两种方式:静态初始化和动态初始化。
静态初始化:初始化时显示指定每个数组元素的初始值,有系统决定数组长度。
动态初始化:初始化时只指定数组长度,不指定初始值,此时数组中的元素的值为默认值(0,false或者null)。
例如:
//数组静态初始化
int[] attr1 = {0,1,2};
//数组动态初始化
int[] attr2 = new int[3];//数组元素为默认值
//可以继续为数组赋值
attr2[0] = 0;
attr2[1] = 1;
attr2[2] = 3;
注意:不要在进行数组初始化的时候既指定数组的长度,又为每个数组元素分配初始值。
数组引用与数组对象的区别:
在Java中数组是看做一个对象,它保存在堆内存中,我们不能直接访问数组对象,需要通过指向数组对象的数组引用来访问,数组引用存储在栈内存中。
在数组的初始化中:int[] attr1;只是声明了数组引用,并没有创建实际的数组,创建实际的数组需要使用new关键字。在静态初始化数组的时候也可以省略new关键字,例如:int[] attr1 = {0,1,2};或者int[] attr3 = new int[]{0,1,2,3};
二维数组
我们可以将二维数组看做特殊的一维数组,即数组中的元素是一个数组,所以二维数组同样有两种初始化方式。例如:
//静态初始化二维数组
int[][] atrr1 = {{0,1},{2,3},{3,4}};
//动态初始化二维数组
int[][] attr2 = new int[3][2];
//也可以只指定第一个值
int[][] attr3 = new int[3][];
数组操作
遍历数组:
遍历数组就是获取数组中的每个元素。通常遍历数组都是使用for循环来实现的,一维数组遍历只需要一层for循环即可,二维数组则需要两层for循环,例如:
public class Test {
public static void main(String[] args) {
//静态初始化二维数组
int[][] attr1 = {{0,1},{2,3},{3,4}};
for (int i = 0;i < attr1.length;i++) {
for (int j = 0;j < attr1[i].length;j++) {
System.out.print(attr1[i][j] + " ");//同一行打印
}
System.out.println();//换行
}
}
}
其中外层for循环用来遍历外层数组,里层循环用来遍历里层数组。
运行结果:
或者我们也可以使用foreach语句来遍历数组:
public class Test {
public static void main(String[] args) {
//静态初始化二维数组
int[][] attr1 = {{0,1},{2,3},{3,4}};
for (int[] is : attr1) {
for (int i : is) {
System.out.print(i + " ");//同一行打印
}
System.out.println();//换行
}
}
}
运行结果:
填充数组元素:
我们可以通过Arrays类的静态方法fill()来对数组中的元素进行替换,该方法有两种参数类型。
(1)fill(int[] a,int value)
该方法可以将指定的值分配给数组的每一个元素的值。例如:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
//静态初始化二维数组
int[] attr1 = {0,1,2,3,4,5};
System.out.println("填充前" + Arrays.toString(attr1));
Arrays.fill(attr1, 0);//将数组attr中的元素置0
System.out.println("填充后" + Arrays.toString(attr1));
}
}
运行结果:
(2)fill(int[] a,int fromIndex,int toIndex,int value)
该方法可以将指定的值分配给数组中指定范围的元素,例如:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
//静态初始化二维数组
int[] attr1 = {0,1,2,3,4,5};
System.out.println("填充前" + Arrays.toString(attr1));
Arrays.fill(attr1, 2,4,0);//将数组attr中的元素置0
System.out.println("填充后" + Arrays.toString(attr1));
}
}
运行结果:
从打印结果中可以看到下标为2和3的元素被填充为0。
对数组进行排序:
通过Arrays类的静态方法sort()可以实现对数组的排序,注意只能升序。例如:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
//静态初始化二维数组
int[] attr1 = {5,1,3,0,4,3};
System.out.println("排序前:" + Arrays.toString(attr1));
Arrays.sort(attr1);
System.out.println("排序后:" + Arrays.toString(attr1));
}
}
运行结果:
复制数组:
Arrays类的copyOf()方法和copyOfRange()方法可以实现对数组的拷贝,copyOf()方法复制数组至指定的长度,copyOfRange()方法将指定数组的指定范围复制到一个新数组中。
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
//静态初始化二维数组
int[] attr1 = {5,1,3,0,4,3};
System.out.println("原数组:" + Arrays.toString(attr1));
int[] attr2 = Arrays.copyOf(attr1, 10);
System.out.println("copyOf()方法新数组:" + Arrays.toString(attr2));
int[] attr3 = Arrays.copyOfRange(attr1, 1, 5);
System.out.println("copyOfRange()方法新数组:" + Arrays.toString(attr3));
}
}