【问题标题】:Compare two primitive long variables in java比较java中的两个原始长变量
【发布时间】:2012-03-13 19:47:47
【问题描述】:

标题是不言自明的。我正在从 C# 迁移到 Java。我有一个对象和一个返回其 ID 的 getter 方法。我想比较两个相同类型的对象的 id 并检查它们的 id 值是否相等。

试过了:

obj.getId() == obj1.getId();

Long id1 = obj.getId();
Long id2 = obj1.getId();

assertTrue(id1.equals(id2))

assertTrue(id1== id2)

【问题讨论】:

标签: java compare long-integer


【解决方案1】:

在java中:

  • == 运算符告诉您两个操作数是否为 相同 对象(实例)。
  • Long 上的 .equals() 方法告诉您它们是否值相等

但你也不应该这样做。正确的做法是这样的:

assertEquals(id1, id2);

使用assertEquals(),如果断言失败,错误消息会告诉你这两个值是什么,例如expected 2, but was 5

【讨论】:

    【解决方案2】:

    要比较两个原始 long,您可以简单地使用 ==

    例子:

    long x = 1L;
    long y = 1L;
    
    if (x == y) {
     System.out.println("value of x and y are same");
    }
    

    要比较两个 Long 对象,您可以使用 Long.compare(long x, long y)。此方法是在 java 1.7 中添加的。下面是方法实现:

    public static int compare(long x, long y) {
            return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }
    

    例子:

    Long x = new Long(1);
    Long y = new Long(1);
    if (Long.compare(x,y) == 0) {
      System.out.println(values of x and y are same);
    }
    

    【讨论】:

      【解决方案3】:

      在java中,

      使用== 比较基元,使用x.equals(y) 比较对象。

      我不确定您的问题是什么——您似乎都尝试了,但都没有奏效?

      注意,你使用的是Long而不是long,所以你想使用.equals()

      long 是原语,Long 是对象)

      【讨论】:

      • 谢谢!我正在比较两个应该相同的文件的修改日期(因为一个被设置为另一个),但是 == 总是失败,即使当我设置断点并检查它们时,它们也是相同的。原来我的错误是“Long jFileTime = jFile.lastModified();”中的大写 L ... 用小写 l 替换它,突然我的 == 比较开始起作用。真的很烦人,它没有给出任何关于我如何发生隐含、非显式转换的编译器警告......
      【解决方案4】:

      尝试执行以下操作:

      assertTrue(id1.longValue() == id2.longValue())
      

      【讨论】:

        【解决方案5】:

        它们不能使用 == 相等。使用任一:

        id1.equals(id2)
        

        id1.longValue() == id2.longValue()
        

        在这两种情况下,我都省略了空检查,因为我怀疑如果这里需要它们,你会忘记它们;)

        那么,为什么 Long 并不总是 == 另一个具有相同值的 Long?答案很简单。它们是不同的对象!取决于 如何 Long 被检索到,它们可能是相同的,因为内部缓存。见Long.valueOf

        【讨论】:

          【解决方案6】:

          除了所有关于正确比较的 cmets,强类型可以帮助您解决问题。

          getID() 是返回 Long 类型(即类类型)还是 long 类型(即原始类型)?问题是,如果方法返回一个原始值,那么与 '==' 和 'equals()' 进行比较都可以工作,因为 Java 在您需要时会自动将原始值转换为包装器对象。

          但另一方面,如果 getID() 返回 Long 值,则与 '==' 比较可能会失败,因为这会检查您是否具有相同的对象,而不是对象是否具有相同的值。

          【讨论】:

            【解决方案7】:

            您需要注意Longlong 之间的区别 - long 是原始类型,Long 是包装类型。 (有点像 C# 中的装箱值,但是是强类型的。)getId() 的返回类型是什么?

            简单地说:

            assertEqual(id1, id2);
            

            如果你在测试中这样做应该没问题。否则,您可以使用:

            if (id1.equals(ids2))
            

            如果它们确实为空,或者使用Guava

            if (Objects.equal(id1, id2))
            

            处理无效性。 (当然,你可以自己写Objects.equal,但你绝对应该掌握Guava无论如何,所以你不妨使用它......)

            值得注意的是,某些包装对象被重用 - 例如:

            // This will work
            Long x = 5L;
            Long y = 5L;
            assertTrue(x == y); // Reference comparison
            
            // This *probably* won't but it could!
            x = 10000L;
            y = 10000L;
            assertTrue(x == y); // Reference comparison
            

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-11-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多