-
基本数据类型所对应的引用数据类型
-
基本数据类型中都存放在栈中,引用类型数据在堆中存放,它们的地址存在栈中
-
Object 可同一所有数据,包装类的默认值是null
整数缓冲区
-
java预先创建了256个常用的整数包装类型对象 -128~127
通过面试题来理解
package com.packageClass;
public class demo02 {
public static void main(String[] args) {
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1 == integer2);
}
}
结果为false,它们都是引用类型,这个比较的是它们的地址是否相同,结果是不同的
继续向下看:
package com.packageClass;
public class demo02 {
public static void main(String[] args) {
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1 == integer2);
int num = 100;
Integer integer3 = num; //自动装箱
Integer integer4 = num;
System.out.println(integer3 == integer4);
int num1 = 200;
Integer integer5 = num1; //自动装箱
Integer integer6 = num1;
System.out.println(integer5 == integer6);
}
}
出现这种结果的原因是:自动装箱是用调用valueOf() 来实现的
xxxxxxxxxx String str2 = "true";String str3 = "trues";boolean flag1 = Boolean.parseBoolean(str2);boolean flag2 = Boolean.parseBoolean(str3);System.out.println(flag2);vhdl
所以说这些结果是因为 valueOf()
我们来查看一下 Integer 中 valueOf() 的源码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
cache 是 Integer 类型的 数组,长度是 (high - low) + 1 ========256
所以cache中有 256 个数组元素
并且通过 for 循环 给 cache 初始化
我们在回到 valueOf() 方法
如果参数 i 大于 -128 小于 127 ,我们就从cache数组中取 这个对象
我们上面给的 integer3,integer4 的值为100,在上面的范围之内,所以返回的是Integer缓冲区cache数组中的对象
从内存中看
我们自动装箱时,在cache数组中找 integer3,integer4 所对应的数值 即 100 找到了就把这个100的地址给 integer3,integer4 所以它们的地址是相等的
如果像 integer5,integer6 没有找到 它们所对应的 200数值 则 return new Integer() 在堆中开辟空间,所以integer5,integer6 它们两个开辟了两块空间,所以它们的地址不相同
这样设计的原因是:在开发过程中,这些数字用的比较多,所以我们把它们创建为对象从而进行复用,可以节省内存的消耗
标签:cache,System,问题,println,Integer,堆栈,new,100 From: https://www.cnblogs.com/GO8k/p/17092498.html