摘要

极客时间里的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字节 的整数倍)。

java 的int 对应clickhouse_自动拆箱

ps:自从上一次第6讲的之后的那天断网了(第二天换了个光猫)。。。就一直托到现在!