Java Long数据类型比较


问题内容

为什么下面的代码即使 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文字。他们不*。即使如此,你永远要使用==String任何文字。

(* Autobox类型确实实现了flyweight模式,但仅适用于-128->
127值。如果将其Long设为等于,则50实际上将有两个对同一个flyweight对象的引用。同样, 永远不要使用== 来比较它们。)

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

如果装箱的值p为true,false,字节或\ u0000到\
u007f范围内的char或-128到127(含)之间的整数或短数,则令r1和r2为结果p的任何两次拳击转换。r1 == r2总是这样。

请注意,long没有 明确提及,但目前甲骨文和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);

输出: