网站首页 > 精选教程 正文
访问警报! 如果您是会员,只需滚动并享受!非会员,请单击此处获取完整访问权限。
嗨! 让我们来谈谈 Java 中可能会让您感到惊讶的事情——为什么有时使用 == 比较数字的行为并不像您预期的那样。是的,我们正在谈论为什么 1 == 1 返回 true,但 128 == 128 可能返回 false 的谜团。听起来很奇怪,对吧?让我们来分解一下!
好奇心——为什么 1 == 1 为真,但 128 == 128 为假
所以,您可能会认为,在 Java 中比较两个数字时,例如 1 == 1 或 128 == 128,它总是会返回 true,因为两边的数字相同,对吧?事实证明,在 Java 中并不总是那么简单。
这里有一个小代码片段来说明这一点:
Integer a = 128;
Integer b = 128;
System.out.println(a == b); // false
Integer x = 1;
Integer y = 1;
System.out.println(x == y); // true
这里有一个小代码片段来说明这一点:
现在,让我们解释一下为什么会发生这种情况,这不仅仅是魔术!这与 Java 中的整数缓存有关。让我们深入了解一下。
整数缓存的魔力
在 Java 中,整数类有一个特殊的优化,称为整数缓存。Java 缓存范围在 -128 到 127 之间的整数对象。为什么?好吧,Java 试图优化内存使用,并且这个范围内的值非常常用,因此它不会为每个对象创建新的对象,而是重用相同的对象。
当您执行类似这样的操作时:
Integer x = 1;
Integer y = 1;
Java不会在内存中为x和y创建两个单独的对象。相反,它会重用缓存的Integer对象作为1。这就是x==y返回true的原因。x和y都指向内存中的同一个对象。
但是当你这样做时:
Integer a = 128;
Integer b = 128;
由于128超出了缓存范围,因此Java创建了两个单独的Integer对象。因此,即使a和b的值都是128,它们在内存中也是两个不同的对象。这就是a==b返回false的原因——它比较的是两个不同的内存位置,而不是实际值。
分解——==与.equals()
现在,这带来了一个重要的区别。在Java中,==比较引用,这意味着它检查两个变量是否指向内存中的同一个对象。另一方面,.equals()比较这些对象内的值。
让我们稍微调整一下前面的代码:
Integer a = 128;
Integer b = 128;
System.out.println(a.equals(b)); // true
发现区别了吗?a.equals(b)返回true,因为它比较了两个Integer对象中的值,即128。它并不关心a和b指向不同的对象。
范围-128到127
Java缓存范围为-128到127的整数值。您可以将此范围视为Java节省内存的最佳点。因此,对于此范围内的任何整数,Java都会重复使用同一个对象。对于此范围之外的值(如128或1000),每次都会创建新的整数对象。
您甚至可以通过设置JVM参数-XX:AutoBoxCacheMax=size来自定义此范围,但默认情况下,它固定为127。
示例回顾:下面是一个带有内存地址的更详细示例:
Integer c = 128;
Integer d = 128;
System.out.println(System.identityHashCode(c)); // Different memory locations
System.out.println(System.identityHashCode(d));
Integer e = 1;
Integer f = 1;
System.out.println(System.identityHashCode(e)); // Same memory location
System.out.println(System.identityHashCode(f));
输出可能如下所示:
212628335
2111991224
false
292938459
292938459
true
对于-128到127范围内的值,您将看到相同的内存地址,但对于该范围之外的值(如128),Java会分配不同的内存位置。
为什么这很重要?
如果您在代码中使用==而不是.equals()来比较数字,这种行为可能会导致意外结果,尤其是对于缓存范围之外的值。那么这里的要点是什么?比较对象值时使用.equals(),除非您特别需要比较内存位置(这在大多数应用程序中很少见)。
猜你喜欢
- 2024-12-29 Log4j 爆“核弹级”漏洞,Flink、Kafka等至少十多个项目受影响
- 2024-12-29 Java switch
- 2024-12-29 在Java中找出1到n个数字之间的重复数
- 2024-12-29 Java训练一个手写数字识别的DeepLearning模型
- 2024-12-29 美团面试:new Integer("127")和Integer.valueOf("128")有区别吗
- 2024-12-29 为什么Java中1==1为真,而128==128为假?基于享元模式的整数缓存
- 2024-12-29 Java水仙花数
- 2024-12-29 如何检查 Java 数组中是否包含某个值?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)