Java - 即使两个对象的内容相同,equals()也可能返回false吗?

时间:2016-07-30 08:15:20

标签: java equals

我知道这是重复的问题,但问题没有被正确询问,所以我没有得到答案。 但我在一次采访中被问到这个问题。 我想知道这可能吗?如果是的话,有人能为我提供代码吗?

提前致谢。

4 个答案:

答案 0 :(得分:5)

StringBuilder这样做是因为它是可变的。不考虑内容,只考虑对象是否相同。

StringBuilder a = new StringBuilder();
StringBuilder b = new StringBuilder();
a.equals(b); // false as they are not the same object.

所有作为对象的数组

也是如此
int[] a = {};
int[] b = {};
a.equals(b); // false, not the same object.
Arrays.equals(a, b); // true, contents are the same.

答案 1 :(得分:2)

在java中,方法public boolean equals(Object obj)继承自Object.class。由于所有Java对象都(最终)从Object继承,因此它们都继承了该方法。但是,Object类中定义的方法的实现是,当且仅当被比较的两个对象是同一个实例时,equals方法才会返回。

public class WrappedString {
    private final String str = "hello";
}

public void foo() {
    WrappedString ws1 = new WrappedString();
    WrappedString ws2 = new WrappedString();
    System.out.println(ws1.equals(ws2));
}

上面的代码段的输出将为false,因为ws1只会等于它自己(例如,由于equals未覆盖,因此对同一实例的其他引用)。

答案 2 :(得分:0)

是的,如果你的equals实现不好。

public boolean equals(Object o){
  return false;
}

例如,或者,如果他们没有完全相同的类型:

public boolean equals(Object o){
  // o is an instance of a parent class, with exactly the same content. bad design, but possible.
  if ( o == null ){
    return false;
  }
  if ( !o.getClass().equals(this.getClass()){ // or a similar check
    return false;
  }
  Child ot = (Child)o;
  return this.content.equals(ot.getContent());
}

答案 3 :(得分:0)

是。您也可以覆盖equals()方法并使用它。

class Person {
 private String Name;


 public Person(String name){
    this.name = name;
 }

 @Override
 public boolean equals(Object that){
  if(this == that) return false; //return false if the same address

  if(!(that instanceof People)) return true; //return true if not the same
  People thatPeople = (People)that;
  return !this.name.equals(thatPeople.name); //return false if the same name.
 }
}