java long数据类型比较

时间:2012-01-23 07:30:56

标签: java 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));
    }
}

4 个答案:

答案 0 :(得分:62)

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

你需要这样做:

if(str.equals(str2))

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

编辑:我明白了......您认为其他对象就像String文字一样。他们不是*。即便如此,您也绝不想将==String文字一起使用。

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

编辑添加:这在Java语言规范中明确说明,Section 5.1.7

  

如果装箱的值p为真,假,字节或范围为\ u0000到\ u007f的字符,或者介于-128和127(含)之间的整数或短数,则让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);

输出:

  


  假

答案 1 :(得分:3)

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

str.longValue()

答案 2 :(得分:3)

如果你想做

      str3==str2

这样做..

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

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

答案 3 :(得分:0)

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

long3 == long2

与下面的** .longValue()**比较

总是更好

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

如果我们使用in-build equal()方法,也会使用null check做同样的事情。

long3.equals(long2)

以下是java

equals()的内部实现
public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}