数组的基础知识
在执行程序的过程中,经常需要存储大量的数据。Java和许多高级语言都提供了一种称作数组的数据结构,可以用它来存储一个元素个数固定且元素类型相同的有序集。一旦数组被创建,它的大小是固定的。使用一个数组引用变量,通过下标来访问数组中的元素。
声明数组变量
elementType[ ] arrayRefVar; ( 元素类型[ ] 数组引用变量; )
elementType可以是任意数据类型,但是数组中的所有元素都必须具有相同的数据类型。
不同于基本数据类型变量的声明,声明一个数组变量时并不在内存中给数组分配任何空间。它只是创建一个对数组的引用的存储位置。如果变量不包括对数组的引用,那么这个变量的值为null。除非数组已经被创建,否则不能给它分配任何的元素。
arrayRefVar = new elementType[arraySize];
这条语句做了两件事:1)使用new elementType[arraySize] 创建了一个数组;2)把这个新创建的数组的引用赋值给变量arrayReVar。
声明一个数组变量、创建数组、然后将数组引用赋值给变量这三个步骤可以合并在一条语句里,
elementType[ ] arrayRefVar = new elementType[arraySize]; 或 elementType arrayRefVar [ ]= new elementType[arraySize];
例如:double [ ] myList = new double[10];
这条语句声明了数组变量myList,创建了一个由10个double类型元素构成的数组,并将该数组的引用赋值给myList。
一个数组变量看起来似乎是存储了一个数组,但实际上它存储的是指向数组的引用。严格地讲,一个数组变量和一个数组是不同的,但多数情况下它们的差别是可以忽略的。因此,为了简化通常可以说myList就是一个数组。
数组的大小和默认值
当给数组分配空间时,必须指定该数组能够存储的元素个数,从而确定数组大小。创建数组之后就不能再修改它的大小。可以使用arrayRefVar.length得到数组的大小。当创建数组后,它的元素被赋予默认值,数值型基本数据类型的默认值为0,char型的默认值为 ‘ \0000 ’,boolean型的默认值为false。
访问数组元素
数组元素可以通过下标访问。其范围从0开始到arrayRefVar.length-1结束。数组中的每个元素都可以使用下面的语法表示,称为下标变量
arrayRefVar[index];
创建数组后,下标变量与正常变量的使用方法相同,例如:
myList[2] = myList [0] + myList [1] ;
数组初始化语法
Java有一个简捷的标记,称作为初始化语法,它使用下面的语法将声明数组、创建数组和初始化数组结合到一句语句中:
elementType [ ] arrayRefVar = { value0 ,value1 ,... ,valuek};
例如:double [ ] myList = {8 , 1 ,4 , 42};
处理数组
处理数组元素时,经常会用到for循环,理由有以下两点看:
1)数组中的所有元素都是同一类型的。可以使用循环以同样的方式反复处理这些元素。
2)由于数组的大小时已知的,所以很自然地使用for循环。
下面是一些处理数组的例子
1、使用输入值初始化数组
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.pritln("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.print("myList[i]" + " ")
}
4、对所有元素求和
double total = 0 ;
for (int i = 0 ; i < myList.length; i++){
total += myList[i];
}
5、找出最大元素
double max = myList[0];
for (int i = 1 ; i < myList.length; i++){
if (myList[i] > max)
max = myList[i];
}
6、找出最大元素的最小下标值
double max = myList[0];
int indexOf = 0;
for (int i = 1 ; i < myList.length; i++){
if(myList[i] > max){
max = myList[i];
indexOfMax = i;
}
}
7、随机打印
for(int i = myList.length - 1; i > 0; i--){
int j = (int)(Math.random() * (i + 1));
double temp = myList[i];
myList[i] = myList[j];
myList[j] = temp;
}
8、移动元素
double temp = myList[0];
for(int i = 1; i < myList.length; i++){
myList[i - 1] = myList[i];
}
myList[myList.length-1] = temp;
数组的复制
要将一个数组中的内容复制到另外一个中,你需要将数组的每个元素复制到另外一个数组中。你可能会尝试使用赋值语句(=)
list2 = list1;
该语句并不能将list1引用的数组内容复制给list2,而只是将list1的引用值复制给了list2,在这条语句之后,list1和list2都指向同一个数组。list2原先所引用的数组就不能再引用,它就变成了垃圾,会被Java虚拟机自动收回。
在Java中,可以使用赋值语句复制基本数据类型的变量,但不能复制数组。将一个数组变量赋值给另一个数组变量,实际上是将一个数组的引用复制给另一个变量,使两个变量都指向相同的内存地址。
复制数组的有三种方法:
1)使用循环语句逐个地复制数组的元素。
int[] sourceArray = {2, 3, 5, 10};
int[] targetArray = new int [sourceArray.length];
for(int i = 0; i <sourceArray.length; i++){
targetArray[i] = sourceArry[i];
}
2)使用System类中的静态方法arraycopy。
3)使用clone方法复制数组。
将数组传递给方法