Integer用==比较会出现两种结果

本文探讨了Java中Integer类型在-128至127范围内使用==运算符进行比较时的行为特性,并深入分析了背后的原因。文章详细解释了Integer缓存机制的工作原理及其在代码中的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看了一个文档,说在使用Integer类型进行比较的时候发现,如果值在-128到127之间的时候用==比较是true ,超出了这个范围就是false了

输出分别是 true ,true,false,true
补充知识,java中的判断对象相等
对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
    如果作用于引用类型的变量,则比较的是所指向的对象的地址
所以如果是4类8中数据基本类型,可以理解是直接比较的值
如果不是的话,比较的是引用变量的地址----这里不再深入讨论
java 重写了相应的equals的方法
造成这个的原因是什么?
Integer是对int做了一层封装,添加了很多方法
查看相应的Integer的代码

Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127);
这个暂时不明白为什么会这样编译
自动装箱和拆箱---以后研究
装箱和拆箱的研究
装箱就是java在编译的时候自动进行了类型的转换,int -integer 装箱,反过来就是拆箱
1.5以后的版本
这是这个方法的代码
assert 断言,判断后面是个Boolean表达式,如果是FALSE的话输出异常,或者信息--默认关闭的,可以开启
1.5以上版本
IntegerCache 是Ingeter的一个内部类

扩展:内部类分好多种,成员内部类,局部内部类,嵌套内部类,匿名内部类---这里以后再讲
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) {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low));
}
high = h;

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

private IntegerCache() {}
}
看他用的是嵌套内部类
嵌套内部类,就是修饰为static的内部类。声明为static的内部类,不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。
      嵌套类和普通的内部类还有一个区别:普通内部类不能有static数据和static属性,也不能包含嵌套类,但嵌套类可以。而嵌套类不能声明为private,一般声明为public,方便调用。
(叫法可能各有不同)
嵌套类----静态嵌套类
----非静态嵌套类(又叫内部类)
(这里也不再展开讲,嵌套类的规则,使用,用法)
这个地方简单的说下,static修饰以后不用绑定Integer的实例化对象了(为什么要这么写?思考中)
接着看上面的代码,如果i的值在-128到127之间的时候,执行下面的代码

否则的话是调用了Ingeter的构造方法新建了一个Ingeter的对象。
里面使用了static{}代码块,表示该类被加载的时候仅仅执行一次(这个也要扩展来讲)
static修饰类的话只能修饰嵌套类,让他变成静态嵌套类(静态嵌套类是什么时候被加载的?)

后面考虑一个问题
Integer integer6 = 300;
int i = 300;
System.out.println(integer6==i);
答案是什么,你自己试试吧,为什么是这样呢?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值