繁体   English   中英

java long数据类型比较

[英]java Long datatype comparison

为什么下面的代码对于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));
    }
}

Long是一个对象,而不是一个原始对象。 通过使用==您将比较参考值

你需要这样做:

if(str.equals(str2))

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

编辑:我明白了......你在想其他对象就像String文字一样。 他们不*。 即使这样,你也不想使用== with String literals。

(* Autobox类型确实实现了flyweight模式,但仅用于值-128 - > 127.如果你使Long等于50你确实会有两个对同一flyweight对象的引用。再次, 永远不要使用==来比较它们。)

编辑添加:这在Java语言规范的第5.1.7节中有具体说明:

如果被装箱的值p为真,假,字节或范围为\\ 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对象中获取原始值:

str.longValue()

如果你想做

      str3==str2

这样做..

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

这样可以更快地实现您的目的,因为您要比较两个基本类型值而不是对象。

这里Long是一个Wrapper类,所以下面的行将比较引用而不是内容。

long3 == long2

它总是比** .longValue()**更好,如下所示

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

如果我们使用in-build equal()方法,也会使用null检查执行相同的操作。

long3.equals(long2)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM