【问题标题】:Java == strange behavior [duplicate]Java ==奇怪的行为[重复]
【发布时间】:2014-01-21 06:40:18
【问题描述】:

我想在我的应用程序中检查整数相等,但遇到了一个奇怪的行为。在某些时候,我的应用程序可以正常工作,但在某些时候却失败了。所以我只是在这里写了一个测试代码

public class EqualityTest {

     public static void main(String args[]) {
           Integer a = 100;
           Integer b = 100;
           Integer c = 1000;
           Integer d = 1000;
           if (a == b) {
                 System.out.println("a & b are Equal");
           }
           else {
                 System.out.println("a & b are Not Equal");
           }

           if (c == d) {
                 System.out.println("c & d are Equal");
           } else {
                 System.out.println("c & d are Not Equal");
           }
     }
}

输出

a & b are Equal
c & d are Not Equal

我的问题是为什么 c 和 d 不相等?

【问题讨论】:

标签: java equality


【解决方案1】:

Integer 使用 缓存 范围为 -128 到 127 的小值,因此对于 100 等小值,您将获得相同的实例。

对于超出此范围的值,将创建并返回一个新的 Integer 实例。

【讨论】:

  • 并且缓存的值在 -128 到 127 之间。在这个范围内的任何东西,你都会得到相同的对象(所以 100 等于。)并且在这个范围之外的任何东西,都会返回一个新对象(2值 1000 的新 Integer 对象 .. 所以你得到 false ..)
【解决方案2】:

Integer 是可变类,在缓存中保留大约 -128 到 127 个整数。所以 == 将适用于整数 -128 <= i <= 127

每次您使用此范围创建 Integer 时,它都会返回您之前创建的相同对象。

Java 7 可以通过系统属性实现:

-Djava.lang.Integer.IntegerCache.high=<size>

【讨论】:

    【解决方案3】:

    整数是一个对象。 您应该使用 equal 而不是 == 喜欢

    if(a.equal(b)){
    ...
    }
    

    【讨论】:

    • 不回答问题.. OP 已经知道了...
    • 这不是完整的答案:请解决小值的缓存问题。
    【解决方案4】:
            Integer a = 100;
            Integer b = 100;
            Integer c = 1000;
            Integer d = 1000;
            if (a.equals(b)) {
                System.out.println("a & b are Equal");
            }
            else {
                System.out.println("a & b are Not Equal");
            }
            if (c.equals(d)) {
                System.out.println("c & d are Equal");
            } else {
                System.out.println("c & d are Not Equal");
            }
    

    ==表示它们的指针或引用相等,而不是值相等。你应该调用 .equals 方法

    【讨论】:

    • 这不是完整的答案:请解决小值的缓存问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2015-07-26
    • 2020-04-26
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多