目录
前言
小伙伴们大家好,日常使用业务层方面的代码居多,但也不可忘了基本的一些代码格式以及原理,比如最近看到的一种题型,这里就涉及到了自动装箱的基础知识了
Integer i = new Integer(10);
Integer j = 10;
Integer k = 10;
System.out.println(i == j); //false
System.out.println(k == j); //true
一、自动装箱与拆箱(以 Integer 包装类为例)
1、装箱就是自动将基本数据类型转换为包装器类型( int >> Integer),调用Integer.valueOf(int )方法
2、拆箱就是反过来,将包装器类型转换为基本数据类型,调用了Integer.intValue方法
3、java并不是一开始就支持自动拆装,查了下是在Java SE5之后才支持该功能
二、再来看看几个示例
1.比如前言中提到的 i 和 j 为什么不相等?
2.通过new 关键字生成的Integer对象比较
Integer i = new Integer(127);
Integer j = new Integer(127);
System.out.println(i == j); //false
3.Integer.valueOf 方法缓存的对象大小区间
Integer k = 10;
Integer l = Integer.valueOf(10);
Integer l1 = Integer.valueOf(128);
System.out.println(k == l); //true
System.out.println(k == l1); //false
来看下 Integer.valueOf 方法内部 ,制定了数值范围如果是在[-128,127]之间,返回IntegerCache缓存中已经存在的对象的引用,否则创建一个新的 Integer对象,所以k 和 l 指向的是同一个对象,k 和 l1 分别指向不同的对象
三、Double ,Float 类型亦是如此吗?
Double i = 10.0;
Double j = 10.0;
Float i1 = 10.0f;
Float j1 = 10.0f;
Long i2 = 10l;
Long j2 = 10l;
System.out.println(i == j); //false
System.out.println(i1 == j1); //false
System.out.println(i2 == j2); //true
通过结果可以看出,Long 类型之外的都没有缓存的功能
四、补充
IntegerCache 类
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
五、章末
好了,文章到这里就结束了~