摘要

极客时间里的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~127

    byte 在 Java 占8bit。最高位是符号位。
    表示成十进制就是 -128 ~ 127

    Short:也是 -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

https://www.cnblogs.com/duanxz/p/4967042.html