代码之家  ›  专栏  ›  技术社区  ›  xploreraj

请解释长相等条件

  •  0
  • xploreraj  · 技术社区  · 9 年前

    考虑以下条件:

    if (isCustom() == new Long(1)) {
        System.out.println("ok 1");
    }
    if (1L == new Long(1)) {
        System.out.println("ok 2");
    }
    

    对于以下定义:

    static Long isCustom() {
        return 1L;
    }
    

    输出为:

    好的2

    但对于

    static long isCustom() {
        return 1L;
    }
    

    输出为:

    好的1

    好的2

    我在这里没有抓住重点!

    4 回复  |  直到 9 年前
        1
  •  4
  •   Xirema    9 年前

    在前一种情况下,您将返回一个自动装箱的Object。

    在后一种情况下,您将返回一个长值。

    因为后者只是一个值,所以代码正在评估 价值观 1L和[具有该值的对象的自动取消装箱值]1L。

    在前一种情况下,代码正在评估 两个对象的身份 两者都具有值1L。

        2
  •  3
  •   khelwood Muhammed Elsayed.radwan    9 年前

    在第一种情况下,你有两个 Long 对象,并且您正在检查它们是否是同一对象(因为您正在使用 == .equals ). 它们不是同一个对象。

    在第二种情况下 long 值与 长的 对象,以及 长的 被取消装箱 长的 价值 == 工作正常 长的 价值观

        3
  •  2
  •   rgettman    9 年前

    在第一个示例中 isCustom() 方法正在返回 Long -- 1L 被装箱到 长的 对象当您使用 == 运算符,Java使用引用相等。那两个 长的 对象,即使它们表示相同 long -- 1升 --是不同的对象,因此条件是 false "ok 1" 未打印。请注意 certain Long s are not required to be cached like certain Integer s .

    注意,与 整数 类,此方法为 需要缓存特定范围内的值。

    在第二个示例中 is自定义() 方法正在返回 长的 --这里不打拳击。这个 == 操作员然后将 Long(1) 1升 将其与 长的 由返回 is自定义() ,条件是 true “好1” 打印。

        4
  •  1
  •   olambert    9 年前

    这与java原语和装箱类型有关。原始版本 long 由java(“盒装”)自动转换为对象版本- Long ,反之亦然。

    在上面的第一个场景中,您将返回一个装箱的原语 长的 (即对象),并进行比较以查看该对象是否与您刚刚创建的新对象具有相同的引用。换句话说,您正在比较 长的 与另一个 长的 。自从您创建了 new Long() ,对象不同,因此if语句返回false,不打印“ok 1”。

    在第二个场景中,您将返回原语类型,并将原语与对象(即 长的 用一个 长的 。在这种情况下,对象( 长的 )将“取消装箱”为基元类型,并将两个基元类型与 == ,您不是检查对象引用,而是检查它们是否具有相同的值。

    第二种情况(“ok 2”)总是比较一个原语 长的 带有一个对象 长的 ,由于与上述第二种情况相同的原因,总是如此。