【java数组】数组在内存中的存储结构及传参逻辑

本文详细解释了一维数组、二维数组和字符串在内存中的存储方式,以及数组传参时的地址传递机制。强调了改变数组元素与重新分配地址的区别,以及多维数组中高维地址的重要性。
摘要由CSDN通过智能技术生成

数组在内存中的存储

数组在内存中的存储结构

一维数组

int[] arr = { 1, 2, 3, 4 };在内存中的存储方式:

       ┌───┬───┬───┬───┐
arr───▶│ 1234 │
       └───┴───┴───┴───┘

执行arr = new int[] { 7, 8, 9 };时,它指向一个新的3个元素的数组:

     arr ──────────────────────┐
					      	   │
         					   ▼
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│   │ 1234 │   │   │ 789 │   │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

但是,原有的4个元素的数组并没有改变,只是无法通过变量arr引用到它们而已,字符串也是如此。

字符串

String buff = "banana";

      ┌───────────┐
ns───▶│ "banana" │
      └───────────┘

二维数组

            arr0 ─────┐
                      ▼
                    ┌───┬───┬───┬───┐
         ┌───┐  ┌──▶│ 1234 │
ns  ────▶│░░░│──┘   └───┴───┴───┴───┘
         ├───┤      ┌───┬───┬───┬───┐
         │░░░│─────▶│ 5678 │
         ├───┤      └───┴───┴───┴───┘
         │░░░│──┐   ┌───┬───┬───┬───┐
         └───┘  └──▶│ 9101112 │
                    └───┴───┴───┴───┘

字符串数组

String[] buff = { "ABC", "XYZ", "zoo" };

                   ┌──────────────────────────┐
               ┌───┼─────────────────┐        │
               │   │                 ▼        ▼
         ┌───┬─┴─┬─┴─┬──┬──────┬──┬─────┬──┬────┬──┐
buff ───▶│░░░│░░░│░░░│  │"ABC"│  │"XYZ"│  │"zoo"│
		└─┬─┴───┴───┴──┴──────┴──┴─────┴──┴─────┴──┘
           │                ▲
           └────────────────┘

它相当于一个二维数组。

names[1]进行赋值,例如buff[1] = "cat";,效果如下:

                ┌─────────────────────────────────────────────────┐
    	 buff   │   ┌─────────────────────────────────┐           │
           │    │   │                                 │           │
           ▼    │   │                                 ▼           ▼
      ┌───┬───┬─┴─┬─┴─┬───┬───────┬───┬───────┬───┬───────┬───┬───────┬───┐
      │   │░░░│░░░│░░░│   │ "ABC" │   │ "XYZ" │   │ "zoo" │   │ "cat" │   │
      └───┴─┬─┴───┴───┴───┴───────┴───┴───────┴───┴───────┴───┴───────┴───┘
            │                 ▲
            └─────────────────┘

这里注意到原来names[1]指向的字符串"XYZ"并没有改变,仅仅是将names[1]的引用从指向"XYZ"改成了指向"cat",其结果是字符串"XYZ"再也无法通过names[1]访问到了。

由以上结构得知,一维数组及字符串直接指向数组元素地址,多维数组及字符串数组间接指向数组元素地址。

数组在内存中的传参逻辑

数组传参时,传的是数组指向的地址,字符串首先指向元素所在的地址,传参之后,改变字符串,接收方的值不会改变,因为字符串指向新的地址,参数仍指向原来的地址。

下例:

public class Test {
	static String name;
	static void get(String names) {
		name=names;
	}
	public static void main(String[] args) {
		Test t = new Test();
		String names="xiaoMing";
		t.get(names);//name为xiaoMing
		names="xiaoHuang";//此时name是xiaoMing,不变
	}
}

查看其地址的变化:
在这里插入图片描述

而对于数组及字符串数组,进行以上类似操作时, 如果将其整体重新new了一次,也就是重新分配了地址,其结果及理论与以上相同。

如果只改变数组或字符串数组其中的元素,而不是重新给其分配地址,则接收方也跟着改变。双方任意一方对这个对象的修改,都会影响对方。

因为传参时传递的是地址,一维数组,改变其中的元素并不会影响地址,而同样指向这个地址的接收方自然也会被影响。

对于多维数组及字符串数组,他们和接收方实际指向的是高维部分的地址。低维相当于高位部分的元素,高维地址不发生改变,二者就相当于指向同一个地方,自然也会相互影响。

下例:

public class Test {
	static int[][] num;
	static void get(int[][] n) {
		num=n;
	}

	public static void main(String[] args) {
		Test t = new Test();
		int[][] n = { { 2, 5 }, { 7, 4 }, { 8, 5, 2} };
		t.get(n);
		n[1] = new int[] {1,2};//此时num=2 5 1 2 8 5 2
	}
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值