第7讲 | int和Integer有什么区别?
该思维导图由 AI 生成,仅供参考
典型回答
考点分析
- 深入了解
- 翻译
- 解释
- 总结
Java中的int和Integer虽然在表面上看起来很相似,但实际上有着明显的区别。int是Java的原始数据类型之一,代表整数,而Integer是int的包装类,它提供了对int类型数据的封装和操作。在Java 5中引入了自动装箱和自动拆箱功能,使得int和Integer之间的转换更加便捷。另外,Java 5还新增了静态工厂方法valueOf,利用缓存机制来提升性能,其中默认缓存范围是-128到127之间的数值。这篇文章涵盖了Java中的原始数据类型和包装类的基础知识,以及自动装箱、自动拆箱机制和缓存机制的相关内容。在面试中,这些知识点可能会成为考察的重点,面试官可能会结合其他方面来考察面试者的掌握程度和思考逻辑。文章还提出了一些可能的面试问题,如自动装箱/自动拆箱发生的阶段、缓存机制的作用、原始数据类型和包装类的差异以及Integer源码的设计要点等。因此,这篇文章对于想要快速了解Java中int和Integer的区别以及相关面试考点的读者来说是一份有价值的资料。文章还涵盖了自动装箱、拆箱的语法糖、源码分析、原始类型线程安全以及Java原始数据类型和引用类型的局限性等内容,为读者提供了全面的技术视角。
《Java 核心技术面试精讲》,新⼈⾸单¥59
全部留言(82)
- 最新
- 精选
- Kyle置顶节选自《深入理解JAVA虚拟机》: 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 HotSpot虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit,官方称它为"Mark Word"。 对象头的另外一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据信息并不一定要经过对象本身,这点将在2.3.3节讨论。另外,如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中却无法确定数组的大小。 接下来的实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要记录起来。 第三部分对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说,就是对象的大小必须是8字节的整数倍。2018-05-192139
- cookie。置顶对象由三部分组成,对象头,对象实例,对齐填充。 其中对象头一般是十六个字节,包括两部分,第一部分有哈希码,锁状态标志,线程持有的锁,偏向线程id,gc分代年龄等。第二部分是类型指针,也就是对象指向它的类元数据指针,可以理解,对象指向它的类。 对象实例就是对象存储的真正有效信息,也是程序中定义各种类型的字段包括父类继承的和子类定义的,这部分的存储顺序会被虚拟机和代码中定义的顺序影响(这里问一下,这个被虚拟机影响是不是就是重排序??如果是的话,我知道的volatile定义的变量不会被重排序应该就是这里不会受虚拟机影响吧??)。 第三部分对齐填充只是一个类似占位符的作用,因为内存的使用都会被填充为八字节的倍数。 还是个初学者。以上是我了解,不知道有没有错,希望老师能告知。2018-05-1913195
- 行者1. Mark Word:标记位 4字节,类似轻量级锁标记位,偏向锁标记位等。 2. Class对象指针:4字节,指向对象对应class对象的内存地址。 3. 对象实际数据:对象所有成员变量。 4. 对齐:对齐填充字节,按照8个字节填充。 Integer占用内存大小,4+4+4+4=16字节。
作者回复: 不错,如果是64位不用压缩指针,对象头会变大,还可能有对齐开销
2018-05-20341 - George计算对象大小可通过dump内存之后用memory analyze分析
作者回复: 嗯,也可以利用: jol,jmap,或者instrument api(Java agent)等等
2018-05-2518 - Gerald为什么我感觉都这么难啊😭
作者回复: 感谢反馈,具体哪个方面,我可以调整一下,尽量照顾不同基础的朋友
2018-05-29515 - Miaozhe杨老师,问个问题,如果使用原始类型int定义一个变量在-128和127之间,如int c = 64;会放入Integer 常量缓存吗(IntegerCache)?编译器是怎么操作的?
作者回复: 不需要,不是对象
2018-05-218 - 云泥缓存的原理是怎样的?感觉这部分还没理解
作者回复: 建议你跟踪下类似Integer.valueOf(xxx),看看IntegerCache的实现,底层是个常量数组,在静态初始化块中创建并缓存对象
2019-01-2725 - 云飞想知道Integer 不就是4字节嘛?为什么要从对象角度考虑就变成了4+4+4+4=16字节?
作者回复: header 补齐,如果仅仅是表示数据,object是个高成本的东西,而且开销不仅是空间,引用结构也会影响内存布局
2018-10-152 - Darren老师,原始数据类型的包装类是对象吗?
作者回复: 类是类,实例化后才是对象
2018-06-162 - 小浪那么请问杨老师,什么时候用基本类型,什么时候用包装类?
作者回复: 看应用场景的需求吧,在程序可读性、开发效率和性能等方面进行取舍,包装类毕竟创建的是对象,有很多方便的方法,甚至有些场合,例如一些Collection,还只接受对象
2019-02-101