简述
此文是对 第7讲 | int和Integer有什么区别? 的学习
一些知识点/笔记点:
- Java 的 8 个原始数据类型(Primitive Types,boolean、byte 、short、char、int、float、double、long)
- 原始数据类型不是对象
- 在 Java 5 中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java 可以根据上下文,自动进行转换为包装类
- 因为大部分数据操作都是集中在有限的、较小的数值范围,所以 Java 5 中新增了静态工厂方法 valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。
- 自动装箱 / 自动拆箱是发生在什么阶段?自动装箱是一种语法糖,它们发生在编译阶段,也就是生成的字节码是一致的。
- 代码验证编译阶段,用Javap -v 验证
Constant pool:
#1 = Methodref #5.#14 // java/lang/Object."<init>":()V
#2 = Methodref #15.#16 // java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
#3 = Methodref #15.#17 // java/lang/Integer.intValue:()I
- Integer 源码的学习:valueOf 缓存范围为-128 到 127; value 声明为 private final; 定义了类似 SIZE 或者 BYTES 这样的常量,考虑不同平台的移植。
- 原始类型线程安全,并发保证或者使用 AtomicInteger、AtomicLong 这样的线程安全类
扩展
- OC 里面同样有这种原始类型数据和引用类型之间转换的问题
- Java 对象
- 对象由三部分组成,对象头,对象实例,对齐填充。
- 其中对象头一般是十六个字节,包括两部分
- 第一部分有哈希码,锁状态标志,线程持有的锁,偏向线程id,gc分代年龄等。
- 第二部分是类型指针,也就是对象指向它的类元数据指针,可以理解,对象指向它的类。
- Mark Word: 标记位 4字节,类似轻量级锁标记位,偏向锁标记位等。
- Class对象指针:4字节,指向对象对应class对象的内存地址。
- 对象实际数据:对象所有成员变量。
- 对齐:对齐填充字节,按照8个字节填充。
网友评论