Java中的数组

       String底层是char数组来实现的,ArrayList底层也是数组实现的。所谓数组,是相同数据类型的元素按一定顺序排列的集合。看如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args){
char[] charArr1 = {'a','b','c'};//声明数组的第一种写法
char[] charArr2 = new char[]{'图','解','J','a','v','a'};//声明数组的第二种写法
char[] charArr3 = new char[5];//声明数组的第三种写法
charArr3[0] = '1';
charArr3[1] = '0';
charArr3[2] = '0';
charArr3[3] = '8';
charArr3[4] = '6';

System.out.println(charArr1);
System.out.println(charArr2);
System.out.println(charArr3);
}

       编译后打开class文件,反编译如下:

1
2
3
4
5
6
7
8
public static void main(String[] args){
char[] charArr1 = new char[]{'a','b','c'};
char[] charArr2 = new char[]{'图','解','J','a','v','a'};
char[] charArr3 = new char[]{'1','0','0','8','6'};
System.out.println(charArr1);
System.out.println(charArr2);
System.out.println(charArr3);
}

       三种数组的声明方式编译后,最后创建的方式都是一样的,都加了new关键字,还把charArr3的声明与赋值一体化了。

       Object类有的方法数组都有,它还多了一个length属性(注意不是方法)。在Java层面,我们完全可以把数组当成对象来看待,下图模拟数组在堆内存中的大致的样子,每一个数组都是按顺序排列在堆内存中,正因为如此,我们可以通过数组+[下标]的方式来直接访问数组里的元素。

char数组在内存中的示意图

       再来看二维数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args){
char[][] x = {{'a','b','c'},{'c','d','e'},{'f','g','h','i'}};
char[][] y = new char[][]{{'1','2','3'},{'4','5','6'},{'7','8','9','a'}};
char[][] z = new char[2][3];
z[0][0] = 'a';
z[0][1] = 'b';
z[0][2] = '1';
z[1][0] = '2';
z[1][1] = '3';

System.out.println(x.toString());
System.out.println(y.toString());
System.out.println(z.toString());
}

       这里还是用了三种方式去声明,反编译class文件,虽然有点差别,但还是大同小异,都加了new关键字(这次没有把z数组和赋值一体化)。

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args){
char[][] x = new char[][]{{'a','b','c'},{'c','d','e'},{'f','g','h','i'}};
char[][] y = new char[][]{{'1','2','3'},{'4','5','6'},{'7','8','9','a'}};
char[][] z = new char[2][3];
z[0][0] = 97;
z[0][1] = 98;
z[0][2] = 49;
z[1][0] = 50;
z[1][1] = 51;
System.out.println(x.toString());
System.out.println(y.toString());
System.out.println(z.toString());
}

       二维数组,其实就是二级数组而已。下图中只画出了数组x:

二维数组在内存中的示意图

参考资料:
清浅池塘 Java中的数组

Fork me on GitHub