运用的知识点:包装类、静态代码块、静态内部类、静态方法、私有化、for循环、数组等
面试题:判断下列
Integer integer1 = Integer.valueOf(100); Integer integer2 = Integer.valueOf(100);
System.out.println(integer1 == integer2);
Integer integer3 = Integer.valueOf(200); Integer integer4 = Integer.valueOf(200);
System.out.println(integer3 == integer4);
使用打印结果和代码及写入源代码进行讲解
public class Test03 {
/**
* 知识点 :深入包装类底层源码
*面试题:
* Integer integer1 = Integer.valueOf(100);
* Integer integer2 = Integer.valueOf(100);
* System.out.println(integer1 == integer2);
*
* Integer integer3 = Integer.valueOf(200);
* Integer integer4 = Integer.valueOf(200);
* System.out.println(integer3 == integer4);
*/
public static void main(String[] args) {
Integer integer1=Integer.valueOf(100);
Integer integer2=Integer.valueOf(100);
System.out.println(integer1==integer2);//true
System.out.println("------------------");
Integer integer3=Integer.valueOf(200);
Integer integer4=Integer.valueOf(200);
System.out.println(integer3==integer4);//false
System.out.println("------------------");
MyInteger MyInteger1=MyInteger.valueOf(100);
MyInteger MyInteger2=MyInteger.valueOf(100);
System.out.println(MyInteger1==MyInteger2);//true
System.out.println("------------------");
MyInteger MyInteger3=MyInteger.valueOf(200);
MyInteger MyInteger4=MyInteger.valueOf(200);
System.out.println(MyInteger3==MyInteger4);//false
}
}
public class MyInteger {
private int value;//定义一个int类型的value用来转换String
public MyInteger(int value) {//定义该类属性
this.value = value;
}
public static MyInteger valueOf(int i) {//静态方法
if (i >= MyIntegerCache.low && i <= MyIntegerCache.high) {//设定数组满足的区间
return MyIntegerCache.cache[i - MyIntegerCache.low];//满足时返回对应值中
}
return new MyInteger(i);//当不满足时,新建一个MyInteger,将其放入其中,注意,只要是不满足的,都单独开辟空间放入
}
//MyInteger的缓冲类------静态内部类
private static class MyIntegerCache {
private static final int low = -128;//取值范围为常用的量,即一个字节,[-128~127]
private static final int high = 127;
private static final MyInteger[] cache;//定义静态数组
//静态代码块
static {
//初始化缓冲数组
cache = new MyInteger[high - low + 1];//初始化静态数组创建对象
int j = low;
for (int i = 0; i < cache.length; i++) {
cache[i] = new MyInteger(j++);
}
}
}
@Override
public String toString() {
return Integer.toString(value);//得到int类型
}
}
总结:
Integer底层有个缓存类,缓存类中有个数组,存储了-128~127的Integer对象
Integer.valueOf(num)底层会判断num是否在-128~127这个区间,如果在内就从缓存
数组中获取数据,如果不在这个区间就new对象