int、Integer(待完善。。。)

563 阅读2分钟

Java中有8中原始数据类型(byte、short、char、int、float、double、long),int就是其中之一

Intger是int对应的包装类,它有一个int类型的字段存储数据,并提供自动装箱和自动拆箱的功能。自动装箱和自动拆箱分别通过静态工厂方法valueof和intValue方法实现。

Integer中IntegerCache提供了对-128~127之间数值的缓存。因为根据实践发现,大多数数据操作都集中在这个范围。而valueof方法会使用到缓存机制。

缓存机制并不只是Integer有,比如:

  • Boolean,缓存了true/false对应的实例。确切说只会返回两个常量的实例Boolean.TRUE/FLASE
  • Short,同样缓存了-129~127之间的数值
  • Byte,数值邮箱,所以全部都缓存了
  • Character,缓存范围'\u0000'到'\u007F'。

和String一样,Integer中int字段也被声明为“private final”。这样设计是有一定道理的,Integer中提供了getInteger()方法,用于方便的读取系统属性,在这种场景中,Integer就是不能够被修改的。

值得注意的是原始类型int并不是线程安全的。特别是float、double这类比较宽的数据类型,甚至不能够保证更新操作的原子性,可能出现程序读到只更新了一半的数据位的数值。

Integer对象的内存结构和占用的内存大小:

  1. Mark Word:标记位 4字节,类似轻量级锁标记位,偏向锁标记位等。
  2. Class对象指针:4字节,指向对象对应class对象的内存地址。
  3. 对象实际数据:对象所有成员变量。
  4. 对齐:对齐填充字节,按照8个字节填充。

Integer占用内存大小,4+4+4+4=16字节。