Java长整型数据类型比较

34

为什么下面的代码返回 falselong3 == long2比较时,即使它是字面值。

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个回答

67

Long是一个对象,而不是原始类型。使用==比较的是引用值

您需要执行:

if(str.equals(str2))

像您在第二个比较中所做的一样。

编辑:我明白了...您正在考虑其他对象像String文字一样运作。他们不是这样的*。即使如此,您也永远不希望使用==String文字进行比较。

(*自动装箱类型确实实现了飞行权重模式,但仅适用于值-128→127。如果您的Long等于50,则确实会有两个引用指向同一个飞行权重对象。同样,永远不要使用== 进行比较。)

添加编辑:这在Java语言规范中专门说明了,第5.1.7节:

如果被封箱的值p为true、false、介于\u0000和\u007f之间的byte或char、或者介于-128和127(包括两端)之间的int或short数,则让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);

输出:

true
false


嗨,Brian!感谢你的回答,但是你能告诉我在哪里可以找到关于这个范围(-128 -> 127)的解释吗? - Renato Lochetti
1
@RenatoLochetti 这在Java语言规范(JLS)第5.1.7节的最后一段中有所涉及。这是享元模式的一种实现方式。 - Brian Roach
1
@RenatoLochetti 编辑了问题以扩展主题。 - Brian Roach

3
如果想要进行操作,您可以:
      str3==str2

这样做...

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

这样做更加高效,因为它比较的是两个原始类型值而不是对象。

3
您还可以使用以下方法从Long对象中获取基本值:
str.longValue()

1

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

long3 == long2

最好使用 **.longValue()** 进行比较,如下所示:

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

如果使用内置的 equal() 方法,那么也会进行相同的操作,同时还会进行空值检查。

long3.equals(long2)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接