Java中的int和Integer
摘要
极客时间里的Java核心技术系列,第7讲,记录一些笔记。
关键词:自动拆箱、自动装箱、缓存、静态工厂
- Java号称是一切接对象,对象都是引用类型,往往是分散的存储在堆的不同位置,所以就无法利用现代CPU的缓存机制。
但是Java中也有基本数据类型的,在内存里就是一段连续的内存。
基本数据类型和Java泛型并不能配合使用。Java 中的泛型是伪泛型,在编译期就转换为特定的类型了。
所以就决定了使用泛型就 必须要可以转换为 Object 类。
从 Java5 开始,就引入了自动拆箱/装箱机制。
自动拆箱/装箱机制 是发生在编译期间的行为。
自动装箱:
Integer a = 123;
背后是调用了 Integer里的静态工厂方法 valueOf()
静态工厂方法:
能够创建“新"对象的静态方法。尽可能的使用缓存中的实例。
Integer 里的缓存实例 范围是 -128 ~ 127。
这个 最高的127是默认的,可以给 jvm 传参来改变。
(-XX:AutoBoxCacheMax=N)
-
基本类型 对应的包装类型的缓存
Boolean: TRUE/FALSE
Byte: 数量少,全部缓存了。-128~127byte 在 Java 占8bit。最高位是符号位。
表示成十进制就是 -128 ~ 127Short:也是 -128 ~ 127
Character:’\u0000’ ~ ‘\u007F’ (换成十进制就是 0 ~ 127) -
基本数据类型占用空间大小:
short、char : 16bit
int、float:32bit
long、double:64bit
boolean :可以用1bit来存储,JVM在编译期间将boolean转为int(true为1,false为0)。具体的大小没有明确的规定
自动拆箱:
int b = a;
背后是调用 Number 抽象类里有的 intValue() 方法。
- 自动拆箱的 xxxVlaue()提供来源:
Integer a = new Integer(123) 和 Integer a = 123 的区别:
一个是创建对象, 一个是自动装箱(使用缓存里的实例)。
创建10万个对象 和 10万个整数,开销显而易见的就不是一个数量级别的。
HotSpot虚拟机中,Java 中的对象在内存中的结构分为:
对象头、实例数据、对齐填充(对象的大小要是 8字节 的整数倍)。
ps:自从上一次第6讲的之后的那天断网了(第二天换了个光猫)。。。就一直托到现在!
参考链接:
https://cyc2018.github.io/CS-Notes/#/notes/Java%20%E5%9F%BA%E7%A1%80
https://www.liaoxuefeng.com/wiki/1252599548343744/1260473794166400