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

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

一、前提须知

1.前提
数据类型,分为

       基本数据类型(数值型,字符型,布尔型)
                          
       引用类型(类,接口,数组,[当然引用类型也有根据引用级别来进行分类的]);

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

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

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

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

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

1.基本数据类型

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

int a = 123;       //创建一个整型类型的变量a

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

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

int b[] = {1,2,3};    //创建一个一维数组b

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

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

3.特殊的String类型

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

String c = "死鱼不要太安乐";         //创建string类型变量c
String d = new String("死鱼有点南");   //创建一个String类型的对象d
String e = new String("死鱼有点南")

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

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

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

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

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

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值