加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

这种奇怪的Java行为的原因是什么?

发布时间:2020-12-14 05:41:54 所属栏目:Java 来源:网络整理
导读:我想在Longs上测试’==’运算符,这就是我发现的:以下代码: public static void main(final String[] args) { final Long n = 0L; final Long m = 0L; System.out.println(n + " == " + m + " : " + (n == m)); final Long a = 127L; final Long b = 127L;
我想在Longs上测试’==’运算符,这就是我发现的:以下代码:
public static void main(final String[] args) {
    final Long n = 0L;
    final Long m = 0L;
    System.out.println(n + " == " + m + " : " + (n == m));

    final Long a = 127L;
    final Long b = 127L;
    System.out.println(a + " == " + b + " : " + (a == b));

    final Long A = 128L;
    final Long B = 128L;
    System.out.println(A + " == " + B + " : " + (A == B));

    final Long x = -128L;
    final Long y = -128L;
    System.out.println(x + " == " + y + " : " + (x == y));

    final Long X = -129L;
    final Long Y = -129L;
    System.out.println(X + " == " + Y + " : " + (X == Y));
}

输出:

0 == 0 : true
127 == 127 : true
128 == 128 : false
-128 == -128 : true
-129 == -129 : false

我能想到的唯一解释是JVM将所有长值存储在Perm空间中的[-128,127]内,并将它们的地址提供给Longs以及上述范围之外的所有值,它为每个静态值创建一个新的分配在代码中遇到了.

我接近正确吗?我们在什么情况下必须注意类似的行为?

PS.我知道我应该使用nullcheck然后使用.equals()来比较对象,但我很好奇是否有人知道答案.

编辑

在jtahlborn回答谁给我关键字自动拳击后,我发现了这篇关于well-documented answer的精彩文章

解决方法

这是自动装箱的结果.见 Long.valueOf().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读