Java基础--基本数据类型与引用数据类型在内存结构上的区别

简介: Java基础--基本数据类型与引用数据类型在内存结构上的区别

基本数据类型与引用数据类型在内存结构上的区别

经过上一节的学习,咱们对数组有了大致的了解,包括如何定义使用,不清楚的小伙伴戳这里哈,非常详尽!!!

一/ 引入

【案例一】看一下下面的输出结果是多少。

public class TestArray2{
    public static void main(String[] args){
        int a=10;
        int b=a;
        b=100;
        System.out.println(a);
    }
}

毫无疑问,答案是10。

看一下运行结果吧:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mJL3Y4Pp-1658541704882)(D:\Typora图片\image-20220723083519820.png)]

【案例二】看一下下面的输出结果是多少。

public class TestArray2{
    public static void main(String[] args){
        int[] x={10,20,30};
        int[] y=x;
        y[0]=100;
        System.out.println(x[0]);
    }
}

看一下结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hFgS0tB6-1658541704886)(D:\Typora图片\image-20220723084023106.png)]

这个结果,很多人就会有疑惑了(疑惑是10,还是100)。

数组之所以难,不是在它的使用。而是它底层的原理,你到底有没有弄明白。

别着急,往后看,你会越来越通透。

二/ 内存存储

【案例一】

public class TestArray2{
    public static void main(String[] args){
        int a=10;
        int b=a;
        b=100;
        System.out.println(a);
    }
}

上面的案例一,内存上是如何执行的?

为了方便理解,画图解释,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UifMlIe5-1658541704886)(D:\Typora图片\image-20220723085759058.png)]

【案例二】

public class TestArray2{
    public static void main(String[] args){
        int[] x={10,20,30};
        int[] y=x;
        y[0]=100;
        System.out.println(x[0]);
    }
}

上面的案例二,内存上又是如何执行的?

之前我们说过变量,变量在内存中:

1.是栈内存中的小容器,类型定义了只能存储这种东西。

2.容器中只能存一份。


int[] x={10,20,30};

现在可以看到,x是一个数组,三个数是不能像变量那样存入一个空间的。

先来看一下int[] x={10,20,30};的标准写法:int[] x=new int[]{10,20,30};

new是新建的意思。

:star:==以后只要见到new关键字,相当于在堆内存空间中申请开辟了一块新的空间。==

既然新建了一块空间,那这块空间长啥样呢?

就是new关键字后面的内容,即开辟一块int[]数组类型的空间。

那数组类型的空间又长啥样?

:star:==数组在堆内存中的空间形态,是一串连续的地址。==

每一个小格子存的是int类型的数据。

整个开辟空间并存完东西的过程,叫做 数组的初始化

如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LfzcIvyC-1658541704886)(D:\Typora图片\image-20220723092015246.png)]

:question: 既然创建完成了,那么如何把10,20,30存入x空间里面呢?

既然在堆内存中是一串连续的地址。

那么,就把第一个地址交给x处理。

:star: ==x里面存的其实是地址(门牌号)。==

我们可以通过x里面存放的地址,找到数据在堆内存里面存储的位置。

第一个位置找到了,后面的是连续的,就都找到了。

现在暂时理解为是地址,其实是一个HashCode,以后再说这个。

如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sKveXRdz-1658541704887)(D:\Typora图片\image-20220723092747594.png)]


int[] y=x;

第二步,继续创建一个y空间,名字叫y,存储类型为int[]数组类型。

y空间的值是x给的。

x里面存的是一个地址

那么就是,==x将自己空间的地址,复制了一份,交给了y。==

如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EODeruvx-1658541704887)(D:\Typora图片\image-20220723093325417.png)]

既然y里面存的是地址,那么就可以通过这个地址访问到堆内存中的数据


y[0]=100;

再来看最后一步,这行代码的含义就是:

通过y里面存储的地址,找到堆内存中的数据(即10所在的位置)。

然后在常量区内复制了一份100,交给了堆内存中第一个位置。(将第一个数据,改成了100)

这里是y[0],就是第一个位置,即10。所以覆盖的就是10啦。

如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qnU3iYJr-1658541704888)(D:\Typora图片\image-20220723094149809.png)]


System.out.println(x[0]);

虽然输出的是x[0],但是x里面的地址指向的堆内存的数据,发生了变化。

第一个数据已经变成了100,所以最后输出,就是100啦。

:red_car:为了方便大家理解,在这里再举个小例子。可以对照着看我上面画的图哈。

小王(x)和小明(y)两个人,都有同一个仓库的钥匙(地址)。

现在小明(y)将仓库里面的西瓜拿走了,装入了菠萝。

过一会,小王(x)再次打开仓库,里面存放的就是菠萝啦。

三/ 总结

(1)基本类型变量空间存储的是,传递的是,如【案例一】。

一个改变,另一个不变。

(2)引用类型变量空间存储的是地址(引用),传递的是地址(引用),指向同一个空间。

空间内数据改动了,那就都会改动,如【案例二】。

一个改变,另一个跟着改变。

(3)所有的变量空间都存储在栈内存里。(简单来说,等号左边的东西在栈内存里面)

变量空间可以存储基本数据类型,也可以存储引用数据类型。

如果变量空间存储的是基本数据类型,存储的是,一个变量改变,另一个不会跟着改变。

(每一个变量里面存储的是一个固定的值,别人变化和我无关)。

如果变量空间存储的是引用数据类型,存储的是地址(引用),一个变量地址对应的值改变,另一个跟着改变。

相关文章
|
7天前
|
运维 Java
Java版HIS系统 云HIS系统 云HIS源码 结构简洁、代码规范易阅读
云HIS系统分为两个大的系统,一个是基层卫生健康云综合管理系统,另一个是基层卫生健康云业务系统。基层卫生健康云综合管理系统由运营商、开发商和监管机构使用,用来进行运营管理、运维管理和综合监管。基层卫生健康云业务系统由基层医院使用,用来支撑医院各类业务运转。
30 5
|
1月前
|
存储 分布式计算 网络协议
阿里云服务器内存型r7、r8a、r8y实例区别参考
在阿里云目前的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y这几个实例规格,相比于活动内的经济型e、通用算力型u1实例来说,这些实例规格等性能更强,与计算型和通用型相比,它的内存更大,因此这些内存型实例规格主要适用于数据库、中间件和数据分析与挖掘,Hadoop、Spark集群等场景,本文为大家介绍内存型r7、r8a、r8y实例区别及最新活动价格,以供参考。
阿里云服务器内存型r7、r8a、r8y实例区别参考
|
1月前
|
Java
JAVA选择结构
JAVA选择结构
18 1
|
1月前
|
Java
Java isBlank和isEmpty的区别
JavaisBlank和isEmpty的区别
17 0
|
15天前
|
存储 Java
Java中的基本数据类型有哪些?它们的大小和取值范围是多少?
Java基础数据类型:4种整型(byte[-128,127],short[-32,768,32,767]),2种浮点(float,double),1种字符(char,Unicode),1种布尔(true,false)。
17 0
|
1月前
|
Java
JAVA基本数据类型输入输出流
JAVA基本数据类型输入输出流
16 0
|
2天前
|
JavaScript 前端开发 Oracle
java和JavaScript的区别
java和JavaScript的区别
6 3
|
18天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
40 0
|
29天前
|
Java
java的 isEmpty 和 isBlank 区别?
java的 isEmpty 和 isBlank 区别?
8 0
|
1月前
|
Java
Java选择结构
Java选择结构
8 0

热门文章

最新文章