【问题标题】:What is the difference between these two almost identical blocks of code? [duplicate]这两个几乎相同的代码块有什么区别? [复制]
【发布时间】:2016-02-26 07:17:43
【问题描述】:

我有这个代码:

int i = 128;
Integer a = i;
Integer b = i;
System.out.println("a==i " + (a == i)); // true
System.out.println("b==i " + (b == i)); // true
System.out.println("a==b " + (a == b)); // false
System.out.println("equals ->"  + a.equals(i)
                                + b.equals(i)
                                + a.equals(b)); // true, true, true

然后我将变量 i 更改为 127:

int i = 127;
Integer a = i;
Integer b = i;
System.out.println("a==i " + (a == i)); // true
System.out.println("b==i " + (b == i)); // true
System.out.println("a==b " + (a == b)); // true !!! look here
System.out.println("equals ->"  + a.equals(i)
                                + b.equals(i)
                                + a.equals(b)); // true, true, true

我不明白,为什么“真”变成了“假”?

【问题讨论】:

    标签: java


    【解决方案1】:

    与内存有关

    为了节省内存,Java 会“重用”所有其值的包装对象 属于以下范围:

    所有布尔值(真假)

    所有字节值

    从 \u0000 到 \u007f 的所有字符值(即十进制的 0 到 127)

    从 -128 到 127 的所有 Short 和 Integer 值。

    -128 到 127 之间的长值。

    【讨论】:

    • 还有 Long 介于 -128 和 127 之间的值。
    • @PeterLawrey ty 发表评论。我在哪里可以找到关于 Long 的说明。是在 Java 7 中吗?
    • Javadoc 说“public static Long valueOf(long l) 返回一个表示指定 long 值的 Long 实例。如果不需要新的 Long 实例,通常应优先使用此方法而不是构造函数Long(long),因为这种方法通过缓存频繁请求的值可能会产生显着更好的空间和时间性能。请注意,与 Integer 类中的相应方法不同,此方法不需要缓存特定范围内的值。”
    • 但是消息来源说; public static Long valueOf(long l) { final int offset = 128; if (l >= -128 && l
    • @PeterLawrey ty。由于装箱拆箱,以下示例对于 int 和 long 的工作方式不同。 Long l128 = 128L; Long l1 = 128L; Long l2 = 128L; System.out.println(l1 == l2); Integer i128 = 128; Integer i1 = i128; Integer i2 = i128; System.out.println(i1 == i2); 打印 false true。如果我们使用原语 long l128 = 128L; Long l1 = 128L; Long l2 = 128L; System.out.println(l1 == l2); int i128 = 128; Integer i1 = i128; Integer i2 = i128; System.out.println(i1 == i2); 打印 false false 。 =o
    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多