要点提示
一旦数组被创建,它的大小是固定的。
数组中存储的是一组相同类型的数据。
声明数组变量
elementType[] arrayRefvar; // 推荐
或者
elementType arrayRefvar[];
elementType可以是任意数据类型,但是数组中所有的元素必须具有相同的数据类型。
如声明一个int型的数组变量myList:
int[] myList; 推荐使用这种形式的
或者
int myList[];
创建数组
arrayRefvar = new elementType[arraySize]; 创建数组并赋值给变量
声明数组变量、创建数组、将数组引用赋值给变量这三个步骤可以合并在一条语句里:
elementType[] arrayRefvar = new elementType[arraySize]; 推荐
或者
elementType arrayRefvar[] = new elementType[arraySize];
eg:
int[] myList = new int[10];
这条语句的意思是:声明了数组变量myList,创建了一个由10个int型元素构成的数组,并将该数组的引用赋值给myList。
给数组元素赋值
语法:arrayRefVal[index] = value;
例如:
myList[0] = 5;
myList[1] = 6;
myList[2] = 5;
myList[3] = 7;
myList[4] = 10;
myList[5] = 9;
myList[6] = 5;
myList[7] = 70;
myList[8] = 71;
myList[9] = 72;
数组的下标是从0开始,最后一个下标是arraySize-1
数组大小和默认值
数组的大小是指数组的元素个数,创建数组后就不能再修改它的大小,在最初创建的时候需要给数组分配内存空间,所以必须指定该数组能够存储的元素个数,或者在创建之初就对元素进行初始化。
数据大小的获取:arrayRefVal.length
当以上面的方式创建数组后,它的元素被赋予默认值,数值型的基本数据类型的默认值是0,char型默认值是'\u0000', boolean型的是false。引用类型的是null。
访问数组元素
数组元素通过下标访问。
范围是从0到arrayRefVal.length-1
获取元素语法:
arrayRefVal[index]
数组初始化方式
将声明数组、创建数组和初始化数组结合到一条语句中:
elementType[] arrayRefVal = new elementType[]{value0, value1, value2...};
或者
elementType[] arrayRefVal = {value0, value1, value2...}; 这种方式必须将声明、创建和初始化数组都放在一条语句中,将它们分开会产生语法错误
public class ArrayTest {
public static void main(String[] args) {
int[] intList1 = new int[10];
String[] stringList1 = new String[10];
int[] intList2 = new int[]{1,2,3,4};
int[] intList3 = {1,2,3,4};
for (int i=0;i<intList1.length;i++){
System.out.println(intList1[i]); // 10个0
System.out.println(stringList1[i]); // 10个null
}
System.out.println(intList2[4]); // index:4超出intList2的最大下标报错:java.lang.ArrayIndexOutOfBoundsException: 4
}
}
// 使用foreach循环处理数组
for(int i: intList3){
System.out.println(i); // 这里的i是表示数组中的元素,代码相当于是『对intList3里的每个元素进行以下操作』i前的int是对i的类型的声明,这个类型必须跟数组中的数据的类型是相同的
}
复制数组
复制数组有三种方式,这边只介绍两种:
1)使用循环语句逐个地复制数组的元素
2)使用System类中的静态方法arraycopy
arraycopy的使用:
arraycopy(sourceArray, srcPos, targetArray, tarPos, length);
其中:参数srcPos和tarPos分别表示在源数组 sourceArray和目标数组targetArray中的起始位置。
从sourceArray复制到targetArray中的元素个数由参数length指定。
注意:arraycopy方法没有给目标数组分配内存空间。复制前必须创建目标数组以及分配给它的内存空间。
import java.util.Arrays;
public class ArrayTest02 {
public static void main(String[] args) {
// 使用arrarcopy复制数组
int[] ints = {1,2,3,4,5,6,6,7,8,9};
int[] ints1 = new int[10];
System.arraycopy(ints, 1, ints1, 1, 5);
System.out.println(Arrays.toString(ints1)); // [0, 2, 3, 4, 5, 6, 0, 0, 0, 0]
}
}
Arrays类
java.util.Arrays类包括各种各样的静态方法,用于实现数组的排序和查找、数组的比较和填充数组元素,以及返回数组的字符串表示。
① 可以使用sort或者parallelSort方法对整个数组或部分数组进行排序。
double[] numbers = {6.0, 4.4, 1.9, 2.9, 3.4, 7.8};
Arrays.sort(numbers); // [1.9, 2.9, 3.4, 4.4, 6.0, 7.8] 对整个数组进行排序
Arrays.sort(numbers, 1,3); // [6.0, 1.9, 4.4, 2.9, 3.4, 7.8] 对数组中的一部分进行排序(下标1和下标2)
Arrays.parallelSort(numbers); // [1.9, 2.9, 3.4, 4.4, 6.0, 7.8] 对整个数组进行排序
Arrays.parallelSort(numbers, 1, 3); // [6.0, 1.9, 4.4, 2.9, 3.4, 7.8] 对数组中的一部分进行排序(下标1和下标2)
System.out.println(Arrays.toString(numbers));
parallelSort在计算机有多个处理器时会更高效。
②可以采用二分查找法(binarySearch方法)在数组中查找关键字。数组必须按升序排好。存在就返回下标,不存在就返回负数
③可以采用equals方法检测两个数组严格相等。如果两个数组对应的元素都相等,那么这两个数组严格相等。返回值是boolean类型。
④可以使用fill方法填充整个数组或部分数组。
int[] ints2 = new int[10];
System.out.println(Arrays.toString(ints2)); // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Arrays.fill(ints2, 8);
System.out.println(Arrays.toString(ints2)); // [8, 8, 8, 8, 8, 8, 8, 8, 8, 8]
Arrays.fill(ints2, 1, 5, 6);
System.out.println(Arrays.toString(ints2)); // [8, 6, 6, 6, 6, 8, 8, 8, 8, 8]