java long数据类型比较

Man*_*anu 33 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ach 63

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

你需要这样做:

if(str.equals(str2))
Run Code Online (Sandbox Code Playgroud)

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

编辑:我明白了......你在想其他对象就像String文字一样.他们不*.即使如此,你永远要使用==String任何文字.

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

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

如果被装箱值p为真,假,字节,或在范围\ u0000的一个char到\ u007f,或int或-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);
Run Code Online (Sandbox Code Playgroud)

输出: