天天看点

# Java中各种数据的在虚拟机内存中的存储方式(超具象!!)Java中各种数据的在虚拟机内存中的存储方式(超具象!!)

Java中各种数据的在虚拟机内存中的存储方式(超具象!!)

一、前提须知

1.前提:

数据类型,分为

       基本数据类型(数值型,字符型,布尔型)

                           和

       引用类型(类,接口,数组,[当然引用类型也有根据引用级别来进行分类的]);

可以到以下链接对各种数据类型进行了解:
[link](https://wenku.baidu.com/view/c2172a33dd3383c4ba4cd216.html)
           

2.任何数据类型在声明时都会在栈中开辟内存空间;

3.虚拟机内存分为栈、方法区、堆三个部分;

4.一般讨论内存,都是默认讨论方法区和堆中的内存,而不讨论栈中内存(可能是声明时一定会开辟空间,所以默认不算)

二、根据数据类型的不同,讨论各种数据在内存中的存储方式

1.基本数据类型

*声明时,只在栈中开辟空间,初始化(即赋值时),值也是放在栈中;

# Java中各种数据的在虚拟机内存中的存储方式(超具象!!)Java中各种数据的在虚拟机内存中的存储方式(超具象!!)

       此时,在栈中会开辟一个叫a的房间,里面就住着123;

# Java中各种数据的在虚拟机内存中的存储方式(超具象!!)Java中各种数据的在虚拟机内存中的存储方式(超具象!!)

2.引用类型(String类型较特殊)

       声明时,在栈中开辟空间,初始化(即赋值时),会在方法区和堆开辟内存空间,方法区内存空间中放的是引用类型变量的值,堆中空间放的则是对应值在方法区中的地址(堆中存放的都是地址);

# Java中各种数据的在虚拟机内存中的存储方式(超具象!!)Java中各种数据的在虚拟机内存中的存储方式(超具象!!)

       此时,会在栈中开一个叫b的房间,房间里放着一把钥匙(b在堆中的地址001),而在堆中也会开辟一个房间(假设是001号房间),001房间放着3把钥匙(b的值1、2、3的3个地址A,B,C),在方法区中会开辟三个房间A,B,C,里面分别放着1,2,3

PS:创建b的时候总共开辟了四个内存空间(在堆中的1个房间,在方法区中的三个房间);

# Java中各种数据的在虚拟机内存中的存储方式(超具象!!)Java中各种数据的在虚拟机内存中的存储方式(超具象!!)

3.特殊的String类型

       String类型数据,同样会在方法区和堆开辟内存空间,但是在方法区中有个字符串常量池(String类型专用) ,用来存放String类型对象的值

# Java中各种数据的在虚拟机内存中的存储方式(超具象!!)Java中各种数据的在虚拟机内存中的存储方式(超具象!!)
String c = "死鱼不要太安乐";         //创建string类型变量c
String d = new String("死鱼有点南");   //创建一个String类型的对象d
String e = new String("死鱼有点南")
           

此时,在栈中和堆中开辟房间的方式和其他引用类型数据一样,而在方法区中的字符串常量池,其中只开辟了两个房间D,E,放着"死鱼不要太安乐"以及"死鱼有点南",因为字符串常量池中若值相同则只会开辟一个内存空间。

PS:创建d,e对象的时候总共开辟了三个内存空间(2个堆中的房间,1个方法区中字符串常量池中的房间);

# Java中各种数据的在虚拟机内存中的存储方式(超具象!!)Java中各种数据的在虚拟机内存中的存储方式(超具象!!)

       此时的若输出 d==e 的布尔值(下图b代表d,c代表e),结果为:

# Java中各种数据的在虚拟机内存中的存储方式(超具象!!)Java中各种数据的在虚拟机内存中的存储方式(超具象!!)

原因:         “==” 比较运算符只会比较变量的地址,而b,c在堆中的房间号(即地址一个为002,一个为003)是不同的,所以结果为false

以上皆为个人理解及看法,内容还待补充,若有误还望请教以便及时更正