int 是我们常说的整型类型,是Java的8个基本数据类型之一。

Integer 是int对应的包装类,它有一个int类型的字段存储数据,并且提供了基本操作,比如数学运算、int和字符串之间转换等。

Java5中引入了自动装箱和自动拆箱功能(boxing/unboxing),它们可以根据上下文自动进行转换,极大地简化了相关编程。

Integer具有值缓存机制,这涉及到Java5中的另一个改进。构建Integer对象的传统方式是直接调用构造器,直接new一个对象。但是根据实践,我们发现大部分数据操作都是集中在有限的、较小的数值范围,因而,在Java5中新增了静态工厂方法valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。按照Javadoc,这个值默认缓存范围是-128到127。

知识扩展

  • 自动拆/装箱实际上算是一种语法糖,Java平台为我们自动进行了一些转换,保证不同写法在运行时等价,它们发生在编译阶段,也就是生成的字节码是一致的。javac替我们自动把装箱转换为Integer.valueOf(),把拆箱替换为Integer.intValue(),这似乎也顺道回答了另一个问题,既然调用的是Integer.valueOf(),自然能够得到缓存的好处。
  • 缓存机制并不是只有Integer才有,它同样存在于其他的一些包装类,比如:
    • Boolean,缓存了true/false对应的实例,确切说,只会返回两个常量实例Boolean.TRUE/FALSE。
    • Short,同样是缓存了-128到127之间的数值。
    • Byte,数值有限,所有范围内数值都被缓存。
    • Character,缓存范围image.png
  • 原则上,建议避免无意中的装箱、拆箱行为,尤其是在性能敏感的场合,创建10万个Java对象和10万个整数的开销可不是一个数量级的,不管是内存使用还是处理速度,光是对象头的空间占用就已经是数量级的差距了。
  • Integer的缓存范围,我们可以通过设置JVM参数调整:-XX:AutoBoxCacheMax=N
  • 包装类里存储的成员变量value是不可变的,修饰符为private final