int
是 Java
的八个基础数据类型(boolean、byte 、short、char、int、foat、double、long)
之一,Integer
则是其包装类型。需要注意的是,基础数据类型并不是对象,它们的包装类才是。
包装类的缓存
Integer
源码中存在IntegerCache
这个结构,其实就是缓存,缓存的范围为-128 ~ 127
之间,下面的代码中后者就使用到了缓存机制。
Integer i = new Integer(1);
Integer i = new Integer.valueOf(1);
这种缓存机制并不是只有 Integer
才有,同样存在于其他的一些包装类,
Boolean
,缓存了两个常量实例Boolean.TRUE/FALSE
Short
,同样是缓存了-128
到127
之间的数值Byte
,数值有限,所以全部都被缓存
自动装箱和自动拆箱
你可能有疑惑,如果团队代码里有人使用了包装类,有人又使用了基础数据类型 int,那么他俩的代码岂不是不能兼容,要做繁琐的转换操作(Integer.valueOf()
或者Integer.intValue()
)?
可喜的是在 Java 5
中有了自动装箱和自动拆箱功能(实际上就是 primitive value
与 object
之间的隐式转换机制),Java
可以根据上下文,自动进行类型转换,这种转换发生在编译阶段,它们二者生成的字节码是一致的。
编码建议
那么编码时何时用基础数据类型,何时用包装类呢?答案是如果你专注于计算,可以用基础数据类型,如果是做业务建议使用包装类,阿里的 Java 编程规范
中也提到对于实体类型(例如 RPC
、ORM entity
等),建议全部使用包装类。