java 长数据类型比较

2022-09-01 07:20:11

为什么下面的代码返回 false for long3 == 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));
    }
}

答案 1

Long是一个对象,而不是一个基元。通过使用,您可以比较参考值==

你需要做:

if(str.equals(str2))

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

编辑:我明白了。。。你认为其他对象的行为就像文字一样。他们没有*。即使这样,您也永远不想与文字一起使用。String==String

(*Autobox 类型确实实现了蝇量级模式,但仅适用于值 -128 -> 127。如果你把你的等值,你确实会有两个引用到同一个蝇量级物体。再说一遍,永远不要使用==来比较它们。)Long50

编辑以添加:这在 Java 语言规范第 5.1.7 节中有详细说明:

如果装箱的值 p 是 true、false、一个字节或介于 \u0000 和 \u007f 范围内的字符,或者是介于 -128 和 127 之间的整数或短数字(含),则让 r1 和 r2 成为 p 的任意两个装箱转换的结果。总是 r1 == r2。

请注意,没有特别提到,但当前的Oracle和OpenJDK实现确实如此(1.6和1.7),这是从不使用的另一个原因。long==

Long l = 5L;
Long l2 = 5L;
System.out.println(l == l2);
l = 5000L;
l2 = 5000L;
System.out.println(l == l2);

输出:



答案 2

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

str.longValue()

推荐