06. 数组

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后面那一行是存放在堆中的。

看不懂?没关系,我们画一张图。

img

首先,编译时,Jvm看到int[] arr这边,说:“这人创建了一个局部变量,得,我在栈内存中给arr变量划分一块空间吧!”,然后arr变量就在栈内存里呆着了。接着,Jvm又看到了右边的new int[8],心想:“这是个new出来的玩意啊,嗯,得放在堆内存里”,于是!在堆内存中建立了一个数组,这个数组有8个小格子,也就是能放8个元素,如下图

img

把一维数组放在堆内存了以后,Jvm又想起:“这是个动态初始化的一维数组,也就是那个程序员只给出了长度,不给初值!初始化交给我???那怎么办,那我不如给它全填成0算了,反正把垃圾数字覆盖掉就算行了嘛!”于是Jvm高高兴兴地给每个元素赋上了初值0

img

“大功告成!”Jvm以为它的活干完了,但他突然想到:“不对,数组创建好了,但程序员怎么操作这个数组?那我给堆中的数组分配一个地址吧,然后把这个地址传给栈内存中的arr变量,这样arr变量就等于指向了堆这个内存,就像遛狗绳牵着一条狗一样!这样一来arr就可以找到这个数组并且对其进行操作了!”于是给了这个数组一个地址,假设为0x001,并发送给了arr这个变量,于是就可以操作这个数组了,整个创建数组的流程也就到此结束了。

img

存,就像遛狗绳牵着一条狗一样!这样一来arr就可以找到这个数组并且对其进行操作了!”于是给了这个数组一个地址,假设为0x001,并发送给了arr这个变量,于是就可以操作这个数组了,整个创建数组的流程也就到此结束了。

[外链图片转存中…(img-aJfy7Cel-1591166769480)]

这里将地址传给arr变量这种方式个人觉得挺像C中指针的概念,在C语言中同样可以通过指针来操作数组。只不过在Java中,这个arr变量不叫指针变量,而是叫引用。这里插一句题外话,两个不同的引用可以指向同一个数组,就像两根遛狗绳可以牵一条狗一样(不太恰当的比喻XD)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值