欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java自动拆箱装箱的Integer 127和128的比较关系

程序员文章站 2024-03-06 08:39:31
...

定义

首先介绍一下什么是自动装箱自动拆箱吧

自动装箱:自动将基本数据类型转换为包装器类型。

	Integer i =100;
  本质上是,编译器编译时为我们添加了:
  Integer i =new Integer(100);

自动拆箱:自动将包装器类型转换为基本数据类型。

	int a = new Integer(100);
  本质上,编译器编译时为我们添加了:
  int a new Integer(100).intValue();

ok,接下来就是我碰到的那道题
java自动拆箱装箱的Integer 127和128的比较关系

于是我专门搜了一下关于这里的一些坑。

public class Demo1 {
    public static void main(String[] args) {
        Integer a1 = 127;
        Integer a2 = 127;
        Integer a3 = 128;
        Integer a4 = 128;
        int b1 = 127;
        int b2 = 127;
        int b3 = 128;
        int b4 = 128;
        System.out.println(a1==a2);
        System.out.println(a3==a4);
        System.out.println(b1==b2);
        System.out.println(b3==b4);
    }
}

运行结果java自动拆箱装箱的Integer 127和128的比较关系

可以看出当定义为 int 类型的时候运行结果都为true,而当用 Integer a3 = 128时
这里其实就是基本类型和引用类型的区别了,这里我做一下总结:

一:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因

  在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。

     (1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在方法栈中

     (2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的栈中,该变量所指向的对象是放在堆类存中的。

二:在类中声明的变量是成员变量,也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。

   同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量

   (1)当声明的是基本类型的变量其变量名及其值放在堆内存中的

   (2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中

所以a3==a4的结论为false原因也就出来了,因为他们比较的是地址,而在堆内存的地址不一样显而易见为false。

但a1==a2为什么会是true其实是java设计者的的想法

每次都要开辟新空间会占用大量的资源,因此他们规定在-128~127(因为Java设计者认为大家对数的使用大多在100以内)之间的Integer类型的变量,直接指向常量池中的缓存地址,不会new开辟出新的空间。

所以在-128~+127之前定义出来的,不会在堆内存重新开辟空间,所以答案为false

接下来附上Integer类的源码,可以看到low 和high 其实也可以自己修改

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }
相关标签: java 编程语言