首页 > 其他分享 >堆栈区问题

堆栈区问题

时间:2023-02-04 22:15:08浏览次数:45  
标签:cache System 问题 println Integer 堆栈 new 100

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

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

  • 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 它们两个开辟了两块空间,所以它们的地址不相同

 

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

 

 

 

标签:cache,System,问题,println,Integer,堆栈,new,100
From: https://www.cnblogs.com/GO8k/p/17092498.html

相关文章

  • 短路和逻辑与或问题
    逻辑运算符操作的都是boolean类型的变量1、区分逻辑与、短路与:①&与&&的运算结果相同;②当符号左边是true时,&与&&都会执行符号右边的语句;③当符号左边是false时,&......
  • 访问修饰符问题
      访问修饰符是用于控制类、成员方法、属性的被访问权限。`Java`为我们提供了四种服务修饰符,分别是`public`、`protected`、`default`、`private`声明:`default`......
  • 继承细节问题
      extends的意思是“扩展”,子类是父类的扩展Java中只有单继承,没有多继承继承是类和类之间的关系继承关系的两个类,一个是子类,一个是父类子类继承父类的......
  • 全局变量和局部变量使用问题
      在Java中变量类型有成员变量、局部变量和静态变量(类变量、static变量),本篇文章主要介绍成员变量(全局变量)和局部变量的区别。根据变量的作用范围,将程序中的变量分为......
  • 可变形参问题
    这篇文章主要介绍了Java语法糖之个数可变的形参的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学......
  • 重载和重写问题
    重写(Override)重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己......
  • 值传递和引用传递问题
    一、堆、栈举个栗子:intage=22;Stringname=newString("shuaibei");这两个变量存储图如下:如果,我们分别对age、name变量赋值,会发生什么呢?age=18;name=newSt......
  • 向上和向下转型问题
    Java中对象类型之间的类型转换(前提是两个类是父子关系)1.向上转型:把子类对象直接赋给父类引用,自动进行类型转换。​静态方法/成员变量(包括静态变量和实例变量)同“父类引......
  • StringBuffer和StringBuilder问题
    在Java中字符串属于对象,Java提供了String类来创建和操作字符串。String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至......
  • 解决vuepdf不显示章印问题
    找到node_modules/pdfjs-dist/es5/build/pdf.worker.js这个目录if(data.fieldType==="Sig"){data.fieldValue=null;//pdf预览不显示红章问题......