java虽然号称是面向对象的语言,但是原始数据类型仍然是重要的组成部分,所以在面试中考察原始数据类型和包装类型是很常见的。
int是java的8中原始数据类型(boolean byte short char int float double long)之一,Java虽然是面向对象的语言但是原始数据类型是例外。
Integer 是int对应的包装类,它有一个int类型的字段存储数据,并且提供了基本操作,比如数学云算,int和字符串之间的转换等,java5中引入了自动装箱和自动拆箱功能,java可根据上下文自动进行转换,极大简化了相关流程。
关于integer的值缓存,这涉及到java5的一个改动,构建integer的传统方法是直接调用构造器,直接new一个对象,但是根据经验,我们发现大部分的数据操作都是集中供暖在有限的,较小的数值范围,
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
因而在java5中新增加了静态工厂方法 valueOf,在调用他的时候回利用一个缓存机制,带来了性能改进,按照javadoc,这个默认值是 -128到127之间。
知识扩展
1.理解自动装箱,拆箱
自动装箱实际上是一中语法糖,什么是语法糖呢?可以理解为java平台为我们自动进行了一些转化,保证不同的写法在运行时等价,他们发生在编译阶段,也就是生成字节码是一致的。
javac替我们自动把装箱转换为Integer.valueOf(),把拆箱替换为Integer.intValue(),那么如何验证这个结论呢?
下面写一段简单的代码然后反编译一下
Integer integer = 1;
int unboxing = integer ++;
反编译输出:
1: invokestatic #2 // Method
java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
8: invokevirtual #3 // Method
java/lang/Integer.intValue:()I
这种缓存不是只有Integer才有,同样的存在于其他一些包装类上,不如:
- Boolean,缓存了true/false对应实例,确切的说只返回了两个常量实例
- Short 同样缓存了 -128到127
- Byte,数值有限,所以全部缓存了。
- Character,缓存范围'\u0000' 到 '\u007F'。