06. 数组
1、一维数组
创建方式:
//数组创建1:引用,对象,元素
int[] aa;
int[] a = new int[10];
int[] aaa = new int[0]; //空数组
//创建方式2:声明,创建,
int[] b = new int[] {1,2};
String[] strings = new String[] {"Hello World"};
//创建方式3:
int[] c = {1,2,3};
String[] strings2 = {"World"};
动态创建:
int[] a = new int[10];
a[0] = 1;
for(int i = 0; i < a.length; i++) {
a[i] = i;
}
静态创建:
int[] b = new int[] {1,2};
length:
//数组的length是属性
System.out.println(b.length);
String[] strings = new String[] {"hello"};
System.out.println(strings.length);
//字符串的length是方法
String string3 = "hello";
System.out.println(string3.length());
数组的迭代:
//数组的迭代:一般for
for(int i = 0;i<b.length;i++) {
System.out.println(b[i]);
}
//数组的迭代:增强for
//i表示的是数组的元素值,不是下标
for(int i : b) {
System.out.println(i);
}
2、多维数组
创建方式:
//第一种
int[][] array1 = {{1},{1,2},{1,2,3}};
//第二种
int[][] array2 = new int[2][];
array2[0] = new int[] {1,2};
array2[1] = new int[] {1,2,3};
array2[1][1] = 2;
array2[2][2] = 4;
数组的赋值:
本质:把b数组对应的虚地址传给了a数组,所以如果b数组发生改变,a也会相应改变。
int[] a = {1,10,100,1000,10000};
int[] b = {2,20,200,2000,20000,200000};
b=a;
a[1] = 999;
for(int i : b) {
System.out.println(i);
}
结果:
1
999
100
1000
10000
3、数组的复制:
System.arraycopy(原数组,原数组开始位置,目标数组, 目标数组开始位置, 复制长度);
int[] a = {1,10,100,1000,10000};
int[] b = {2,20,200,2000,20000,200000};
//数组复制
System.arraycopy(a, 1, b, 2, 3);
结果:
2
20
10
100
1000
200000
4、数组的生成过程
转发别人的描述,感觉挺好的!!!
我们先假设有这么一行代码:int[ ] arr = new int[8];
即定义了一个一维数组,数组名叫arr,里面一共有8个int类型的元素。
接着我们要了解空间分配的概念,这里主要涉及到堆和栈。
简单点理解栈里存放着局部变量,堆里存放着所有new出来的东西。
也就是说,上面的代码中,我们的arr变量是存放在栈里的,new后面那一行是存放在堆中的。
看不懂?没关系,我们画一张图。
首先,编译时,Jvm看到int[] arr这边,说:“这人创建了一个局部变量,得,我在栈内存中给arr变量划分一块空间吧!”,然后arr变量就在栈内存里呆着了。接着,Jvm又看到了右边的new int[8],心想:“这是个new出来的玩意啊,嗯,得放在堆内存里”,于是!在堆内存中建立了一个数组,这个数组有8个小格子,也就是能放8个元素,如下图
把一维数组放在堆内存了以后,Jvm又想起:“这是个动态初始化的一维数组,也就是那个程序员只给出了长度,不给初值!初始化交给我???那怎么办,那我不如给它全填成0算了,反正把垃圾数字覆盖掉就算行了嘛!”于是Jvm高高兴兴地给每个元素赋上了初值0
“大功告成!”Jvm以为它的活干完了,但他突然想到:“不对,数组创建好了,但程序员怎么操作这个数组?那我给堆中的数组分配一个地址吧,然后把这个地址传给栈内存中的arr变量,这样arr变量就等于指向了堆这个内存,就像遛狗绳牵着一条狗一样!这样一来arr就可以找到这个数组并且对其进行操作了!”于是给了这个数组一个地址,假设为0x001,并发送给了arr这个变量,于是就可以操作这个数组了,整个创建数组的流程也就到此结束了。
存,就像遛狗绳牵着一条狗一样!这样一来arr就可以找到这个数组并且对其进行操作了!”于是给了这个数组一个地址,假设为0x001,并发送给了arr这个变量,于是就可以操作这个数组了,整个创建数组的流程也就到此结束了。
[外链图片转存中…(img-aJfy7Cel-1591166769480)]
这里将地址传给arr变量这种方式个人觉得挺像C中指针的概念,在C语言中同样可以通过指针来操作数组。只不过在Java中,这个arr变量不叫指针变量,而是叫引用。这里插一句题外话,两个不同的引用可以指向同一个数组,就像两根遛狗绳可以牵一条狗一样(不太恰当的比喻XD)。