数组
数组在各种语言中都是使用频率比较高的数据结构,数组在Java中是类,这与C语言中有很大不同。下面我们来看看Java中一维数组与二维数组。
1、一维数组
Java中一维数组的生成方式有两种,一是在{}内直接写元素,另一种是new 数据类型 (元素数量)。这两种方式均可以得到一个数组,如下:
int[] arr = {4,3,2,1};//直接定义数组元素
System.out.println(arr.getClass());
long[] brr = new long[10]; //new 一个数组,初值为0
System.out.println(brr.getClass());
Complex[] crr = new Complex[10];//非八大基本类型的数组,数组无初值,结果为null
System.out.println(crr.getClass());
输出得到:
一维数组的类型为"class[" + "元素类名"。常见的几个类型对象的类名如下:int -> I;double -> D;long -> J。
当初始化了一个数组之后,不进行其他操作,数组的初值是多少呢?
for(int i = 0; i<crr.length; i++) {
System.out.print(crr[i] + " ");
}
System.out.println();
for(int i = 0; i<arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
for(int i = 0; i<brr.length; i++) {
System.out.print(brr[i] + " ");
}
System.out.println();
结果如下:
八大基本类型仅仅new一个对象的话JVM会赋初值为0,其他类的元素的数组无初值,输出结果为null。
2、浅克隆
在一维数组中存在一个clone()方法,这个方法可以克隆一个数组如下:
for(int i = 0; i<crr.length; i++) {
crr[i] = new Complex(i, i+1);
System.out.print(crr[i] + " ");
}
Complex[] cloneCrr = crr.clone();//clone克隆
for(int i = 0; i<cloneCrr.length; i++) {
System.out.print(cloneCrr[i] + " ");
}
结果如上,但这个克隆方法存在一点问题,当我们改变克隆后的数组中的某一个元素时,原数组的元素应该不变,但结果不尽人意:
修改克隆得到的数组的某个元素的值之后原数组也发生了变化,说明这个克隆并不是真正意义上的克隆,在Java中称为浅克隆!浅克隆的意思是并不是克隆了元素的值,而是仅仅克隆了元素的首地址,即当我们访问克隆的数组里的元素空间时,最终访问到的依旧是原数组的元素空间!所以改变克隆的数组时,原数组也是会随之改变。
3、二维数组
二维数组类似于一维数组,即二维数组是元素为一维数组的一维数组!初始化方式也有两种,直接输入元素的值或new一个二维数组。但二维数组初始化时必须有行数初值,例如:int[][] m4 = new int[][3];编译时会出现错误,不允许无行数的二维数组!二维数组的类型也与一维数组差不多,为“class [[” +类型名。测试代码如下:
int [][] m1= {//初始输入多少为多少,数组长度为行数
{1,2,5,4},
{2,4,7},
{1,8,6,7,2},
{1,5}
};
System.out.println("m1.length: " + m1.length);
for (int row = 0; row < m1.length; row++) {
for (int col = 0; col < m1[row].length; col++) {//m1[row].length 即二维数组的一个元素(一维数组)的长度
// System.out.print("m1[row].length: " + m1[row].length );
System.out.print(m1[row][col] + " ");
}
System.out.println();
}
System.out.println(m1.getClass());//二维数组的类型为 [[I
int[][] m2 = new int[3][];
// int[][] m4 = new int[][3];错误实例
long[][] m3 = new long[3][4];
for (int i = 0; i < m2.length; i++) {
m2[i] = new int[i+4];
}
for (int row = 0; row < m3.length; row++) {
for (int col = 0; col < m3[row].length; col++) {
System.out.print(m3[row][col] + " ");
}
System.out.println();
}
二维数组初始输入多少为多少,数组长度为行数,即m1.length结果为行数,二维数组的一个元素(一维数组)的长度为这一行的里面的元素个数,即:m1[row].length。和一维数组一样,八大基本类型仅仅new一个对象的话JVM会赋初值为0。