堆栈区问题

  • 基本数据类型所对应的引用数据类型

  • 基本数据类型中都存放在栈中,引用类型数据在堆中存放,它们的地址存在栈中

  • 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);
  }
}

image-20220720183128608

结果为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);
  }
}

image-20220720185731453

 

出现这种结果的原因是:自动装箱是用调用valueOf() 来实现的

xxxxxxxxxx String str2 = "true";String str3 = "trues";boolean flag1 = Boolean.parseBoolean(str2);boolean flag2 = Boolean.parseBoolean(str3);System.out.println(flag2);vhdl

image-20220720191327157

所以说这些结果是因为 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);
}

image-20220720192213326

image-20220720192705402

cache 是 Integer 类型的 数组,长度是 (high - low) + 1 ========256

所以cache中有 256 个数组元素

并且通过 for 循环 给 cache 初始化

 

我们在回到 valueOf() 方法

image-20220720192846709

如果参数 i 大于 -128 小于 127 ,我们就从cache数组中取 这个对象

我们上面给的 integer3,integer4 的值为100,在上面的范围之内,所以返回的是Integer缓冲区cache数组中的对象

从内存中看

image-20220720194001952

我们自动装箱时,在cache数组中找 integer3,integer4 所对应的数值 即 100 找到了就把这个100的地址给 integer3,integer4 所以它们的地址是相等的

如果像 integer5,integer6 没有找到 它们所对应的 200数值 则 return new Integer() 在堆中开辟空间,所以integer5,integer6 它们两个开辟了两块空间,所以它们的地址不相同

 

这样设计的原因是:在开发过程中,这些数字用的比较多,所以我们把它们创建为对象从而进行复用,可以节省内存的消耗

 

 

 

posted @ 2023-02-04 21:56  进击の埋  阅读(38)  评论(0)    收藏  举报