java中实体数组赋值_Java-中数组的内存分配

Java 中数组的内存分配

1、Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式。

2、数组基本概念

数组是存储同一种数据类型多个元素的容器。

数组既可以存储基本数据类型,也可以存储引用数据类型。

格式:数据类型[] 数组名 ;

int[] arr;

数组的初始化方式:

动态初始化 : 初始化时只指定数组长度,由系统为数组分配初始值。

格式:数据类型[] 数组名 = new 数据类型[数组长度];

数组长度其实就是数组中元素的个数。

int[] arr = new int[3];

解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。

静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度

格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};

int[] arr = {1,2,3};

解释:定义了一个int类型的数组,并且存进去{1,2,3}三个数。

3、Java中数组的内存分配

A、基本内存分配概念图解

bb72957c8a6cbb591625ceb3417a20f0.png

int[] arr 存在于堆内存,new int[3] 存在于栈内存。

在堆内存中每一个 new 出来的对象都有一个唯一的地址值,就如同图中的 001,在 int[] arr = new int[3];

相当于把堆内存的地址值 001 赋值给栈内存的的数组。当执行打印语句时候 : System.out.println(arr); 会打印出地址值。

堆内存每一个对象的数据类型都有默认值(在没有赋值的情况下),如图所示,

当执行打印语句时候 : System.out.println(arr[0]); 会打印出0。

当执行打印语句时候 : System.out.println(arr[1]); 会打印出0。

当执行打印语句时候 : System.out.println(arr[2]); 会打印出0。

栈内存通过地址值 001 找到堆内存对应的 001 地址值,然后通过索引找到对应的数值。

B、静态初始化内存图解

d1bc4b177d53c8109ded31b1873cf19b.png

静态初始化内存如图:当数组初始化的时候,都会有默认值,但是因为我们初始化的时候进行了赋值,所以默认值会被新的赋值所覆盖。

C、一个数组的内存图

0414284a6c495749aed46c32c5253044.png

如图所示,初始值都是 0,当给数组元素赋值时,arr[0]、arr[2] 通过地址值找到堆中对应的地址值,将 arr[0]、arr[2] 进行重新赋值。

D、两个数组的内存图

1958877899937e48503be802946e53a4.png

如图所示,定义了 2 个数组 arr、arr2,它们的初始化都是在堆内存中开辟空间,进行初始化的原始赋值。然后通过不同的地址值地址给不同的的数组进行赋值。

E、两个数组指向同一个地址的内存图(重点)

962eb85477b82f81570d9663bc02a2d5.png

如图所示,初始化数组 arr,然后进行赋值操作。输出即为:100、200、300。

当定义数组 arr2 的时候把第一个数组 arr 的地址值赋给第二个数组,arr2 数组会根据地址值找到堆内存中的 arr 的地址及,

然后给第二个数组进行赋值,会将原来 arr 的数值进行覆盖,所以当我们再次打印 arr 和 arr2 的数据时候,会出现一样的数据。

F、数组操作的两个常见小问题:空指针和索引越界

689f458d26364ceb182887480bb8fa83.png

索引越界:如图所以,数组的初始化是从 0 开始,所以访问数组元素 arr[3] 的时候,会出项索引越界异常。

空指针:如图所示,将 null 赋值给 arr,相当于地址001就没有了,既然没有了地址值指向堆内存,所以就会出项空指针异常。

G、对象数组的内存图

0aef8bec9f750b550f4d281c0be21f7b.png

首先方法区会有 Student.class(里面有成员变量、构造方法、成员方法)、StudentDemo.class(里面有 main函数)。

main 方法执行,栈中开辟空间创建 Student[ ] students,堆内存中会 new Student[3] ,默认值都是 null,通过地址值

001 指向栈。

然后创建学生对象 Student s1,同样通过地址值002指向堆内存为002的对象,而对象的方法(包括构造方法和成员方法)也有

地址值 0001,堆内存通过地址值 0001 指向 方法区对象的方法 0001,进行赋值覆盖。

Student s2,Student s3同理。此时创建完对象并赋值完成时,这3个对象还和 students 数组没有关联。

最后把学生对象作为元素赋值给学生数组:students[0]=s1,其实就是拿着 s1 的地址值 002 指向数组的第一个元素,数组

中的 null 就被 002替代。students[1]=s2;students[2]=s;同理可得!!

赋值完毕后,进行遍历操作时,如果使用 System.out.println(s); 打印出来的是地址值001、002、003。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值