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,缓存范围。
- 原则上,建议避免无意中的装箱、拆箱行为,尤其是在性能敏感的场合,创建10万个Java对象和10万个整数的开销可不是一个数量级的,不管是内存使用还是处理速度,光是对象头的空间占用就已经是数量级的差距了。
- Integer的缓存范围,我们可以通过设置JVM参数调整:
-XX:AutoBoxCacheMax=N
。 - 包装类里存储的成员变量value是不可变的,修饰符为
private final
。