对象在内存中的存储&&基本类型和包装类&&java类型转换

部分转自:https://blog.csdn.net/javazejian/article/details/72828483对象在内存中的存储对象头、实例数据和填充数据(为了对齐)实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。填充数据:由于虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是...
摘要由CSDN通过智能技术生成

对象在内存中的存储

在这里插入图片描述
对象头、实例数据和填充数据(为了对齐)

  1. 实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。

  2. 填充数据:由于虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐,这点了解即可。

  3. 对象头:包括Mark Word和类型指针

Mark Word

Mark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致(4字节 32位)。

类型指针

类型指针指向对象的类元数据,虚拟机通过这个指针确定该对象是哪个类的实例。

markOop实现

HotSpot通过markOop类型实现Mark Word,具体实现位于markOop.hpp文件中。
由于对象需要存储的运行时数据很多,考虑到虚拟机的内存使用,markOop被设计成一个非固定的数据结构,以便在极小的空间存储尽量多的数据,根据对象的状态复用自己的存储空间。
markOop中提供了大量方法用于查看当前对象头的状态,以及更新对象头的数据,为synchronized锁的实现提供了基础。
在32位的HotSpot虚拟机 中对象未被锁定的状态下,Mark Word的32个Bits空间中的25Bits用于存储对象哈希码(HashCode),4Bits用于存储对象分代年龄,2Bits用于存储锁标志 位,1Bit固定为0,在其他状态(轻量级锁定、重量级锁定、GC标记、可偏向)下对象的存储内容如下表所示。
在这里插入图片描述
对象头部分转自:https://www.jianshu.com/p/9c19eb0ea4d8
java对象的内存结构(特别详细 很细节):https://www.cnblogs.com/duanxz/p/4967042.html

八大基本类型

在这里插入图片描述

包装类

Byte Short Integer Long Float Double Character Boolean
还有两个 BigDecimal BigInteger,分别表示,(任意精度的)高精度的整型数字和高精度的定点数,不会出现精度缺失。BigDecimal可以用于货币的计算。
BigDecimal的知识详见我的另一篇文章:
《java中BigDecimalh和BigInteger详解》

为啥出现包装类:

Java是一个面向对象的语言,基本类型并不具有对象的性质,为了与其他对象“接轨”就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

关于boolean的大小:

boolean类型只有两个值:false/true;与其它的几个基本类型不同的是,在Java规范中并没有明确的给出boolean类型的大小,因为在Java虚拟机中,并没有与之对应的类型,而是使用其它的类型代替。

基本类型的默认值

在这里插入图片描述

如上表所示,在java中,基本类型大多默认值为0;
特殊的是:其中boolean类型的默认值为false。char默认值为null(’/uooooo’)

另外,要注意,只有在基本类型的变量作为类成员使用的时候,java才确保给定其初始值。但是不建议使用,建议大家明确指定初始值。
在某个方法中定义的基本类型的局部变量初始值不一定是0.所以必须赋初值,否则会编译错误,告知该变量没有

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值