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

List.contents(A)返回false,但List.contens(B)和B.equals(A)是否返回true?

  •  0
  • user21749640  · 技术社区  · 1 年前

    我的程序中有一个名为 Requirement 使用方法 test(List) ItemRequirement 机具 要求 ,包含 Item A ItemRequirement.test(List) 退货 List.contains(A) 用于输入列表。

    我遇到了一个问题,每当检查ItemRequirement时,它都会返回false,尽管它应该返回true。

    我通过将以下语句放入ItemRequirement.test中对此进行了测试:

    System.out.println(list.contains(A));
    System.out.println(list.contains(B));
    System.out.println(B.equals(A));
    return list.contains(A);
    

    控制台输出为

    false
    true
    true
    

    以及 return false

    我真的很困惑这里发生了什么,好像B.equals(A)和list.contents(B),list.contens(A)不应该也是真的吗?

    我尝试过几个.equals()的实现,它们都有相同的错误,但主要的错误是使用Item的“name”字段,它是一个String。

    equals(Item i) {
       return this.name.equals(i.name);
    }
    

    编辑:我第一次发帖的时候应该提到这个,因为它可能很重要。A和B是同一对象。我有一个静态对象Item.TEST,a和B都指向Item.TEST

    1 回复  |  直到 1 年前
        1
  •  0
  •   NoDataFound    1 年前

    引用的javadoc equals :

    equals方法在非null上实现等价关系 对象引用:

    • 它是自反的:对于任何非null引用值x,x.equals(x)都应该返回true。
    • 它是对称的:对于任何非null引用值x和y,x.equals(y)应返回true当且仅当y.equals(x)返回 是的。
    • 它是可传递的:对于任何非null引用值x、y和z,如果x.equals(y)返回true,y.equals(z)返回true x.equals(z)应返回true。
    • 它是一致的:对于任何非null引用值x和y,多次调用x.equals(y)都会一致地返回true或 始终返回false,前提是没有在equals中使用任何信息 修改对象上的比较。 对于任何非null引用值x,x.equals(null)应返回false。

    这意味着对于任何 a b 应该是平等的,你必须 二者都 a.equals(b) b.equals(a) 退货 true 只有这样你才能确信 list.contains(a) list.contains(b) 两个返回 真的 如果a(或b)包含在列表中。