JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

为什么在Java中128==128为假

wys521 2024-12-29 00:22:24 精选教程 26 ℃ 0 评论

访问警报! 如果您是会员,只需滚动并享受!非会员,请单击此处获取完整访问权限。

嗨! 让我们来谈谈 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(),除非您特别需要比较内存位置(这在大多数应用程序中很少见)。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表