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

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

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

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

一/ 引入

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

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

毫无疑问,答案是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]);
    }
}
AI 代码解读

看一下结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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);
    }
}
AI 代码解读

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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]);
    }
}
AI 代码解读

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

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

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)所有的变量空间都存储在栈内存里。(简单来说,等号左边的东西在栈内存里面)

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

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

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

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

目录
打赏
0
0
0
0
12
分享
相关文章
Java中的数据类型
Java语言提供了八种基本类型,分为4类8种:六个数值型(四个整数型byte、short、int、long,两个浮点型float、double)、一个字符型char和一个布尔型boolean。每种基本类型有固定的位数、取值范围及默认值。此外,还存在`void`类型,但无法直接操作。基本类型支持隐式和显式类型转换,并有对应的包装类如`Integer`、`Double`等,用于在需要对象的场景中使用。包装类支持自动装箱与拆箱机制,简化了基本类型与引用类型的转换,但需要注意性能和空指针异常等问题。
Java中的数据类型
阿里云服务器经济型、通用算力型、计算型、通用型、内存型实例区别与选择指南
在我们通过阿里云的活动选购云服务器的时候会发现,相同配置的云服务器往往有多个不同的实例可选,而且价格差别也比较大,这会是因为不同实例规格的由于采用的处理器不同,底层架构也有所不同(例如X86 计算架构与Arm 计算架构),因此不同实例的云服务器其性能与适用场景是有所不同。本文将详细解析阿里云的经济型、通用算力型、计算型、通用型和内存型实例的性能特点及适用场景,帮助用户根据自己的业务需求做出明智的选择。
|
2月前
|
Java基础之数据类型
Java基础之数据类型
22 6
|
2月前
|
在Java中如何将基本数据类型转换为String
在Java中,可使用多种方法将基本数据类型(如int、char等)转换为String:1. 使用String.valueOf()方法;2. 利用+运算符与空字符串连接;3. 对于数字类型,也可使用Integer.toString()等特定类型的方法。这些方法简单高效,适用于不同场景。
62 7
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
76 4
阿里云服务器内存型r7、r8a、r8y、r8i实例区别及选择参考
随着阿里云2024年金秋云创季的开始,目前在阿里云的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y和内存型r8i这几个实例规格,相比于活动内的经济型e和通用算力型u1等实例规格来说,这些实例规格等性能更强,虽然这几个实例规格的云服务器通常处理器与内存的配比为都是1:8,但是他们在处理器、存储、网络、安全等方面等性能并不是一样的,所以他们的适用场景也有着不同。本文为大家介绍内存型r7、r8a、r8y、r8i实例的性能、适用场景的区别以及选择参考。
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
42 1
[Java]“不同族”基本数据类型间只能“强转”吗?
本文探讨了不同位二进制表示范围的计算方法,重点分析了Java中int和char类型之间的转换规则,以及float与int类型之间的转换特性。通过具体示例说明了显式和隐式转换的条件和限制。
40 0
[Java]“不同族”基本数据类型间只能“强转”吗?
|
3月前
|
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
64 4
[Java]基本数据类型与引用类型赋值的底层分析
本文详细分析了Java中不同类型引用的存储方式,包括int、Integer、int[]、Integer[]等,并探讨了byte与其他类型间的转换及String的相关特性。文章通过多个示例解释了引用和对象的存储位置,以及字符串常量池的使用。此外,还对比了String和StringBuilder的性能差异,帮助读者深入理解Java内存管理机制。
29 0