数组
6.1 数组的基本知识
6.1.1 声明数组变量
为了在程序中使用数组,必须声明一个引用数组的变量,并指明数组的元素类型。下面是声明数组的语法:
element[] arrayRefVar; (元素类型[] 数组引用变量)
6.1.2 创建数组
不同于基本数据类型变量的声明,声明一个数组变量时并不在内存中给数组分配任何空间。下面这条语句做了两件事情:1)使用new elementType[arraySize]创建了一个数组;2)把这个新创建的数组的引用赋值给变量arrayRefVar。
arrayRefVar = new element[arraySize];(数组引用变量 = new 元素类型[数组大小])
声明一个数组变量、创建数组、然后将数组引用赋值给变量这三个步骤可以合并在一条语句里,如:
element[] arrayRefVar = new element[arraySize];
(元素类型[] 数组引用变量 = new 元素类型[数组大小])
6.1.3 数组大小和默认值
当给数组分配空间时,必须通过指定该数组能够存储的元素个数来确定数组大小。创建数组之后就不能再修改它的大小。可以使用arrayRefVar.length求得数组的大小。例如:myList.length为10。
当创建数组后,它的元素被赋予默认值,数值型基本数据类型的默认值为0,char型的默认值为'\u0000',boolean型的默认值为false。
6.1.4 数组下标变量
数组元素可以通过下标访问。数组下标是基于0的,也就是说,其范围从0开始到arrayRefVar.length-1结束。数组中的每个元素都可以使用下面的语法表示,称为下标变量:
arrayRefVar[index]; (数组引用变量[下标];)
6.1.5 数组初始化语法
Java有一个简捷的记法,称作数组初始化语法,它使用下面的语法将声明数组、创建数组和初始化数组结合到一条语句中:
element[] arrayRefVar = {value0, value1, ... , valuek};
6.1.6 处理数组
处理数组元素时,经常会用到for循环,理由有以下两点:
1)数组中所有元素都是同一类型的。可以使用循环以同样的方式反复处理这些元素。
2)由于数组的大小是已知的,所以很自然地就使用for循环。
假设创建如下数组:
double[] myList = new double[10];
下面是一些处理数组的例子:
// 1.使用输入值初始化数组 Scanner input = new Scanner(System.in); System.out.println("Enter" + myList.length + "values:"); for (int i = 0; i < myList.length; i++) { myList[i] = input.nextDouble(); } // 2.使用随机数初始化数组 for (int i = 0; i < myList.length; i++) { myList[i] = Math.random() * 100; } // 3.显示数组 for (int i = 0; i < myList.length; i++) { System.out.println(myList[i] + " "); } // char[]类型的数组 char[] city = { 'H', 'e', 'l', 'l', 'o' }; System.out.println(city); // 4.对所有元素求和 double total = 0; for (int i = 0; i < myList.length; i++) { total += myList[i]; } // 5.找出最大元素 double max = myList[0]; for (int i = 0; i < myList.length; i++) { if (myList[i] > max) max = myList[i]; } // 6.找出最大元素的最小下标值 double max1 = myList[0]; int indexOfMax = 0; for (int i = 1; i < myList.length; i++) { if (myList[i] > max1) max1 = myList[i]; } // 7.随意打乱 for (int i = 0; i < myList.length; i++) { // 随意产生一个下标j(index) int index = (int) (Math.random() * myList.length); // 将myList[i]和myList[j]互换 double temp = myList[i]; myList[i] = myList[index]; myList[index] = temp; } // 8.移动元素 int n = 10; double temp = myList[n]; for (int i = n + 1; i < myList.length; i++) { myList[i - 1] = myList[i]; } myList[myList.length - 1] = temp; // 9.打印数组 System.out.println(Arrays.toString(myList));
6.1.7 for-each循环
Java支持一个简单的for循环,称之为for-each循环或增强型for循环,不使用下标变量就可以顺利地遍历整个数组。通常,for-each循环的语法为:
for(elementType element: arrayRefVar){}
// for-each循环 for (double u : myList) { System.out.println(u); }
6.2 数组的复制
在Java中,可以使用赋值语句复制基本数据类型,但是不能复制数组。将一个数组变量赋值给另一个数组变量,实际上是将一个数组的引用复制给另一个变量,使两个变量都指向相同的内存地址。
复制数组有三种方法:
1)使用循环语句逐个地复制数组的元素。
2)使用System类中的静态方法arraycopy。
3)使用clone方法复制数组。
可以使用循环将源数组中的每个元素复制到目标数组中的对应元素。例如,下述代码使用for循环将sourceArray复制到targetArray:
// 使用for循环复制数组 int[] sourceArray = { 2, 3, 1, 5, 10 }; int[] targetArray = new int[sourceArray.length]; for (int i = 0; i < targetArray.length; i++) { targetArray[i] = sourceArray[i]; }
另一种方法是使用java.lang.System类的arraycopy方法复制数组,而不是使用循环。Arraycopy的语法如下所示:
6.3 给方法传递数组
6.4 从方法中返回数组
6.5 可变长参数列表
6.6 数组的查找
6.6.1 线性查找法
6.6.2 二分查找法
6.7 数组的排序
6.8 Arrays类