【问题标题】:== vs. equals() references/pointers JAVA== 与 equals() 引用/指针 JAVA
【发布时间】:2015-05-23 21:48:25
【问题描述】:

我正在学习 == 与 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 分配给 u,为什么 t.getName() 是 Keen。

公共类 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

} }

【问题讨论】:

  • Java == vs equals() confusion 的可能重复项
  • 没有Person的代码我们怎么知道?
  • @pathfinderelite 在问题得到澄清之前你不能说它是重复的
  • public class Person{ 私有字符串名称;公共人员(字符串 d){ name=d; } public void setName(String a){ name=a; } public String getName(){ 返回名称; }
  • 您需要在Person 中覆盖equals

标签: java pointers reference


【解决方案1】:

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

例如。将此添加到您的 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】:

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

    Object 类的equals() 方法与== 做同样的事情。如果您没有在您的类Person 中重写equals() 方法,那么它不会自动比较Person 对象的内容。

    您必须覆盖 Person 类中的 equals() 方法,以便它以您想要的方式进行比较。

    public class Person {
        private String name;
    
        // ...
    
        @Override
        public boolean equals(Object o) {
            if (!(o instanceof Person)) {
                return false;
            }
    
            return ((Person) o).name.equals(this.name);
        }
    }
    

    【讨论】:

    • 谢谢!但是,我不完全确定如何覆盖该方法,您是否有关于如何做到这一点的资源?
    • equals 的实现相当弱。它随时会爆炸。
    【解决方案3】:

    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);
    }
    

    【讨论】:

      【解决方案4】:

      所有 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());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        相关资源
        最近更新 更多