java自动拆箱装箱的Integer 127和128的比较关系
定义
首先介绍一下什么是自动装箱自动拆箱吧
自动装箱:自动将基本数据类型转换为包装器类型。
Integer i =100;
本质上是,编译器编译时为我们添加了:
Integer i =new Integer(100);
自动拆箱:自动将包装器类型转换为基本数据类型。
int a = new Integer(100);
本质上,编译器编译时为我们添加了:
int a new Integer(100).intValue();
ok,接下来就是我碰到的那道题
于是我专门搜了一下关于这里的一些坑。
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);
}
}
运行结果
可以看出当定义为 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() {}
}
上一篇: Android监听来电和去电的实现方法
下一篇: 详解Java中的final关键字的使用
推荐阅读
-
java自动拆箱装箱的Integer 127和128的比较关系
-
Java包装类和对应基本数据类型的自动拆箱和自动装箱
-
Java13-day04【Integer、int和String的相转、自动装箱和拆箱、Date、SimpleDateFormat、Calendar、异常、try...catch、throws】
-
浅谈什么是java的自动装箱和自动拆箱?
-
Java13-day04【Integer、int和String的相转、自动装箱和拆箱、Date、SimpleDateFormat、Calendar、异常、try...catch、throws】
-
【Java基础】Integer的自动拆箱和享元模式,这次我学到了
-
浅谈什么是java的自动装箱和自动拆箱?