Integer ==问题
首先看一下几个例子:
public class TestInteger { public static void main(String[] args) { Integer a=100; Integer b=100; Integer a1=1000; Integer b1=1000; Integer a0=new Integer(100); Integer b0= new Integer(100); System.out.println(a==b); System.out.println(a1==b1); System.out.println(a0==b0); System.out.println(a.equals(b)); System.out.println(a1.equals(b1)); System.out.println(a0.equals(b0)); } }
运行结果:
true false false
true true true
当我们声明类似Integer a = 100;
的时候,它实际上在内部做的是:
Integer i = Integer.valueOf(100);
valueOf() 方法,我们可以看到
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i
return IntegerCache.cache\[i + (-IntegerCache.low)\];
return new Integer(i);
}
如果值的范围在 - 128 到 127 之间,它就从高速缓存返回实例。
所以…Integer a = 100, b= 100;
指向了同一个对象。
如果两个引用指向同一个对象,用 == 表示它们是相等的。如果两个引用指向不同的对象,用 == 表示它们是不相等的,即使它们的内容相同。
Integer a0=new Integer(100);
Integer中不是有范围是:-128-127
的缓存吗?为什么是false?
先看看Integer的构造方法:它其实并没有用到缓存
。那么缓存是在哪里用的?答案在valueOf
方法中。
我们要养成良好编码习惯,尽量少用==判断两个Integer类型数据是否相等,只有在上述特殊的场景下才相等。而应该改成使用equals
方法判断
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
2019-10-12 死磕Spring AOP (学习持续更新中。。)