java Long 数据类型比较

发布于 2024-12-28 13:09:23 字数 370 浏览 0 评论 0原文

为什么下面的代码对于 long3 == long2 比较返回 false,即使它是字面量。

public class Strings {

    public static void main(String[] args) {
        Long long1 = 256L + 256L;
        Long long2 = 512L;
        Long long3 = 512L;
        System.out.println(long3 == long2);
        System.out.println(long1.equals(long2));
    }
}

Why does the code below return false for long3 == long2 comparison even though it's literal.

public class Strings {

    public static void main(String[] args) {
        Long long1 = 256L + 256L;
        Long long2 = 512L;
        Long long3 = 512L;
        System.out.println(long3 == long2);
        System.out.println(long1.equals(long2));
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

多情癖 2025-01-04 13:09:24

这里 Long 是一个包装类,因此下面的行将比较引用而不是内容。

long3 == long2

与 ** .longValue() ** 进行比较总是更好,如下所示

long3.longValue() == long2.longValue()

如果我们使用-build equal() 方法也将通过空检查执行相同的操作。

long3.equals(long2)

下面是java中equals()的内部实现

public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}

Here Long is a Wrapper class so the below line will compare the reference not the content.

long3 == long2

its always better to compare with ** .longValue() ** like below

long3.longValue() == long2.longValue()

If we use in-build equal() method that also will do the same thing with null check.

long3.equals(long2)

Below is the internal implementation of equals() in java

public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}
傲影 2025-01-04 13:09:23

Long 是一个对象,而不是基元。通过使用==,您可以比较参考值

您需要这样做:

if(str.equals(str2))

正如您在第二次比较中所做的那样。

编辑:我明白了...您认为其他对象的行为类似于String文字。他们不*。即便如此,您也永远不想将 ==String 文字一起使用。

(*Autobox 类型确实实现了享元模式,但仅适用于值 -128 -> 127。如果您将 Long 等于 50,您确实会有两个对再次强调,永远不要使用 == 来比较它们)

编辑添加:Java 语言规范中对此进行了明确规定,第 5.1.7 节:

如果装箱的值 p 是 true、false、一个字节或一个在 \u0000 到 \u007f 范围内的字符,或者是 -128 到 127(含)之间的 int 或短整型数字,则设 r1 和 r2 为p 的任意两次拳击转换的结果。 r1 == r2 的情况总是如此。

请注意,没有特别提到long,但当前的 Oracle 和 OpenJDK 实现确实这样做了(1.6 和 1.7),这是从不的另一个原因使用 ==

Long l = 5L;
Long l2 = 5L;
System.out.println(l == l2);
l = 5000L;
l2 = 5000L;
System.out.println(l == l2);

输出:

真实
错误

Long is an object, not a primitive. By using == you're comparing the reference values.

You need to do:

if(str.equals(str2))

As you do in your second comparison.

Edit: I get it ... you are thinking that other objects act like String literals. They don't*. And even then, you never want to use == with String literals either.

(*Autobox types do implement the flyweight pattern, but only for values -128 -> 127. If you made your Long equal to 50 you would indeed have two references to the same flyweight object. And again, never use == to compare them. )

Edit to add: This is specifically stated in the Java Language Specification, Section 5.1.7:

If the value p being boxed is true, false, a byte, or a char in the range \u0000 to \u007f, or an int or short number between -128 and 127 (inclusive), then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.

Note that long is not specifically mentioned but the current Oracle and OpenJDK implementations do so (1.6 and 1.7), which is yet another reason to never use ==

Long l = 5L;
Long l2 = 5L;
System.out.println(l == l2);
l = 5000L;
l2 = 5000L;
System.out.println(l == l2);

Outputs:

true
false

流心雨 2025-01-04 13:09:23

您还可以使用以下方法从 Long 对象中获取原始值:

str.longValue()

You could also get the primitive value out of the Long object using:

str.longValue()
旧伤慢歌 2025-01-04 13:09:23

如果你想

      str3==str2

这样做......

     str3.longValue()==str2.longValue()

这符合你的目的并且速度更快,因为你正在比较两个基本类型值而不是对象。

If you want to do

      str3==str2

do like this..

     str3.longValue()==str2.longValue()

This serves your purpose and much faster because you are comparing two primitive type values not objects.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文