数组表示一组相同数据类型元素的集合。这里说的相同数据类型既可以是基本数据类型也可以是引用数据类型,但是原则上只能一种。
声明
JAVA中声明并开辟数组:
datatype arrayname [] = new datatype[length];
datatype [] arrayname = new datatype[length];
或者也可以分开写:
datatype arrayname [] = null;
arrayname = new datatype[length];
数组访问
数组的访问和C/C++是相同的,可以通过[]进行访问,同时因为数组越界访问会报错,因此JAVA为数组类型定义了length属性,可以使用该属性得到数组的长度。
数组初始化
JAVA数组的初始化和C/C++也是相同的,都可以通过{}进行初始化。
dataytype arrayname [] = {val1,val2,...};
或者使用完整形式
datatype arrayname [] = new datatype[]{val1,val2,...};
也可以先申请内存,然后使用下标访问数组元素分别赋值。
这里看一下数组访问和初始化的例子:
public class Demo {
public static void main(String args[]) {
int array [] = {1,2,3,4,5};
for (int i = 0;i < array.length;++i) {
System.out.println("The number is " + array[i]);
}
}
}
结果为:
The number is 1
The number is 2
The number is 3
The number is 4
The number is 5
二维数组
二维数组和之前数组的区别就在于多个[]。
声明并开辟数组为:
datatype arrayname [][] = new datatype[rows][cols];
初始化为:
datatype arrayname [][] = {{val1,val2,...},{valm,valn},...};
datatype arrayname [][] = new datatype[rows][cols]{{val1,val2,...},{valm,valn},...};
关于二维数组的例子为:
public class Demo {
public static void main(String args[]) {
int array [][] = {{1,2,3},{4,5,6}};
for (int i = 0;i < array.length;++i) {
for (int j = 0;j < array[i].length;++j)
System.out.println("The number is " + array[i][j]);
}
}
}
结果为:
The number is 1
The number is 2
The number is 3
The number is 4
The number is 5
The number is 6
从上面的形式来看,array.length可以表示二维数组的行数,array[i].length可以表示二维数组的列数,同时也不必事先指定数组的行数和列数,这点倒是比C/C++要用的方便。
数组传参
这里先看一段代码:
public class Demo {
public static void main(String args[]) {
int num = 10;
int array [] = {1,2,3};
addOne(10);
addOne(array);
System.out.println("Num is " + num);
for (int i = 0;i < array.length;++i) {
System.out.println("Array is " + array[i]);
}
}
public static void addOne(int var) {
var = var + 1;
}
public static void addOne(int var[]) {
for (int i = 0;i < var.length;++i) {
var[i] = var[i] + 1;
}
}
}
结果为:
Num is 10
Array is 2
Array is 3
Array is 4
这段代码想表达的意思是:数组属于引用数据类型,在以数组作为参数进行传递的过程中,会使实参和形参的栈内存指向同一块堆内存,而在方法中对堆内存数据进行修改会改变堆内存的原有内容。而基本数据类型并不开辟专用的堆内存,此时数据保存在栈内存,而随着方法的调用,会为方法的形参在栈内存上重新赋值,也就是将实参的值传入,而在方法内部修改该值只会修改方法内部的栈内存对应的值,方法调用结束后,这段栈内存就会释放,而方法调用前的栈内存仍然存在,也并无修改。
数组操作方法
对于数组来说还存在两个常用的操作方法。一个是数组复制:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
另外一个是数据排序:
public static void sort(Object[] a)
再看一个上面两种操作方法的例子:
public class Demo {
public static void main(String args[]) {
int src [] = {5,7,8,9,3,4};
int dst [] = new int[6];
System.arraycopy(src,0,dst,0,6);
for (int i = 0;i < dst.length;++i) {
System.out.println("dst is " + dst[i]);
}
System.out.println("=====================");
java.util.Arrays.sort(dst);
for (int i = 0;i < dst.length;++i) {
System.out.println("dst is " + dst[i]);
}
}
}
结果为:
dst is 5
dst is 7
dst is 8
dst is 9
dst is 3
dst is 4
=====================
dst is 3
dst is 4
dst is 5
dst is 7
dst is 8
dst is 9
从上面的例子可以看出:
- JAVA中数组定义也是可以设定固定长度的
- 可以通过System.arraycopy()方法进行数组复制
- 可以通过java.util.Arrays.sort()方法进行数组复制
对象数组
在本文最开始就说数组是相同数据类型元素的组合,那么当然也可以是自定义的引用数据类型,也就是说可以是对象数组。
对象数组初始化:
classname arrayname = new classname[length];
classname arrayname = new classname[]{var1,var2,...};
这里看一下对象数组的例子:
public class Demo {
public static void main(String args[]) {
Book array [] = {new Book("English",12.5),new Book("Math",22.5),new Book("Code",32.5)};
for (int i = 0;i < array.length;++i) {
array[i].getInfo();
}
}
}
结果为:
Book name is English,book price is 12.5
Book name is Math,book price is 22.5
Book name is Code,book price is 32.5