== vs. equals()引用/指针JAVA

时间:2015-05-23 21:48:25

标签: java pointers reference

我正在学习==与equals()并做各种例子。对于这个,我理解为什么r == s是假的,但是如果它们现在都具有相同的内容,为什么r.equals(s)是假的?

public class StringProgram{
  public static void main(String[] args) {

    Person r = new Person("A");
    Person s = new Person("J");
    s.setName("A");

    System.out.println(r.getName());//A
    System.out.println(s.getName());//A
    System.out.println(r==s);//false
    System.out.println(r.equals(s));//false


  }
}

以下是Person的代码:

public class Person{
    private String name;

    public Person(String d){
    name=d;
    }
    public void setName(String a){
      name=a;
    }

    public String getName(){
      return name;
    }
}

编辑:我发现我现在必须覆盖它,但我仍然不明白下面的例子中的作业是如何工作的。我只是不明白为什么如果将t分配给你,t.getName()就是Keen。

public class StringProgram {   public static void main(String [] args){

Person t = new Person("Gene");
Person u = t;
u.setName("Keen");

System.out.println(t.getName());//Keen
System.out.println(t.equals(u));//true

} }

4 个答案:

答案 0 :(得分:0)

equals()只是一种方法,没有什么特别之处。特别是,它不会自动知道如何比较两个对象的内容。

equals()的{​​{1}}方法与Object的方法相同。如果您未覆盖班级==中的equals()方法,则它不会自动比较Person个对象的内容。

您必须覆盖班级Person中的equals()方法,以便按照您希望的方式进行比较。

Person

答案 1 :(得分:0)

java中的所有类都继承自Object类。当您执行r.equals(s)时,它使用Object类中定义的.equals()方法。要使它按照您的意愿工作,您需要通过重写.equals()方法为Person类定义.equals()方法。

EG。在Person类中添加:

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

注意:我使用eclipse为我生成了equals和hashcode方法。您可以阅读this thread以了解为什么需要覆盖hashcode()。

答案 2 :(得分:0)

Java无法猜测你想做什么,你必须告诉它两个人如果有相同的名字就是一样的。您必须覆盖equals

@Override
public boolean equals(Object o) {
   if (o == this) return true;
   if (o == null) return false;
   if (!(o instanceof Person)) return false;
   Person that = (Person) o;

   if (name == null && that.name == null) return true;
   if (name == null || that.name == null) return false;
   return that.name.equals(name);
}

答案 3 :(得分:0)

所有java类都继承自Object,为了正确地比较你的类,你应该覆盖equals()方法。

public Person(String d){
name=d;
}
public void setName(String a){
  name=a;
}

public String getName(){
  return name;
}

@Override
public boolean equals(Object obj) {
  return obj instanceof Person && 
         this.getName().equals(((Person)obj).getName());
}