Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写equals方法_Java - Fatal编程技术网

Java 重写equals方法

Java 重写equals方法,java,Java,我现在正在复习准备考试。在过去的一篇论文中有一个问题 重写以下类中的equals方法。该方法应检查 整个国家的内容平等 class Employee { String firstName; int age; } [2马克] 我为了正确的答案做了一些修改,到目前为止我已经找到了这个答案。有没有一个更简单的方法来回答这个问题,这是对的?非常感谢你的帮助 public class Employee { int age;

我现在正在复习准备考试。在过去的一篇论文中有一个问题

重写以下类中的equals方法。该方法应检查 整个国家的内容平等

 class Employee
    {
        String firstName;
        int age;
    } 
[2马克]

我为了正确的答案做了一些修改,到目前为止我已经找到了这个答案。有没有一个更简单的方法来回答这个问题,这是对的?非常感谢你的帮助

 public class Employee
    {

     int age;

    public boolean equals(Object obj)
    {
        if(this == obj)
            {
                return true; //Reference equality.
            }    
        if(!(obj instanceof Employee)) 
            {
                return false; // not the same type.
            }
        Employee other = (Employee) obj;
        return firstName == other.firstName;
        return age == other.age;
        }
    }

你的最后一行,年龄比较,是遥不可及的;您不应该使用
==
来比较字符串;您需要考虑空值

由于总体趋势似乎是要为您全面规划,下面是Eclipse的实现:

public class Employee {
    private final String firstName;
    private final int age;

    public Employee(final String firstName, final int age) {
        super();
        this.firstName = firstName;
        this.age = age;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
        return result;
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Employee other = (Employee) obj;
        if (age != other.age) {
            return false;
        }
        if (firstName == null) {
            if (other.firstName != null) {
                return false;
            }
        } else if (!firstName.equals(other.firstName)) {
            return false;
        }
        return true;
    }
}
public boolean equals(Object obj)
{
  if(obj == null)
  {
    return false;
  }
  if(this == obj)
  {
    return true; //Reference equality.
  }    
  if(this.getClass() != obj.getClass())
  {
    return false;
  }
  Employee other = (Employee) obj;
  if(firstName == null)
  {
    if(other.firstName != null)
    {
      return false;
    }
  }
  else if(!firstName.equals(other.firstName))
  {
    return false;
  }
  return age == other.age;
}
以及一系列测试:

import org.junit.Test;

public class EmployeeTest {
    @Test
    public void testEmployeeEquals() {
        final Employee nullNameEmp = new Employee(null, -1);
        final Employee empA1 = new Employee("a", 1);
        final Employee empA1Clone = new Employee("a", 1);
        final Employee empA2 = new Employee("a", 2);
        final Employee empB1 = new Employee("b", 1);
        final Employee empB2 = new Employee("b", 2);
        final Employee subEmp = new Employee("a", 1) {

        };

        assert !nullNameEmp.equals(empA1);
        assert !nullNameEmp.equals(empA1Clone);
        assert !nullNameEmp.equals(empA2);
        assert !nullNameEmp.equals(empB1);
        assert !nullNameEmp.equals(empB2);
        assert !nullNameEmp.equals(subEmp);
        assert !nullNameEmp.equals(null);

        assert !empA1.equals(nullNameEmp);
        assert empA1.equals(empA1Clone);
        assert !empA1.equals(empA2);
        assert !empA1.equals(empB1);
        assert !empA1.equals(empB2);
        assert !empA1.equals(subEmp);
        assert !empA1.equals(null);

        assert !empA2.equals(nullNameEmp);
        assert !empA2.equals(empA1);
        assert !nullNameEmp.equals(empA1Clone);
        assert !empA2.equals(empB1);
        assert !empA2.equals(empB2);
        assert !empA2.equals(subEmp);
        assert !empA2.equals(null);

        assert !empB1.equals(nullNameEmp);
        assert !empB1.equals(empA1);
        assert !empB1.equals(empA1Clone);
        assert !empB1.equals(empA2);
        assert !empB1.equals(empB2);
        assert !empB1.equals(subEmp);
        assert !empB1.equals(null);

        assert !empB2.equals(nullNameEmp);
        assert !empB2.equals(empA1);
        assert !empB2.equals(empA1Clone);
        assert !empB2.equals(empA2);
        assert !empB2.equals(empB1);
        assert !empB2.equals(subEmp);
        assert !empB2.equals(null);

        assert !subEmp.equals(nullNameEmp);
        assert !subEmp.equals(empA1);
        assert !subEmp.equals(empA1Clone);
        assert !subEmp.equals(empA2);
        assert !subEmp.equals(empB1);
        assert !subEmp.equals(empB2);
        assert !subEmp.equals(null);

        assert nullNameEmp.equals(nullNameEmp);
        assert empA1.equals(empA1);
        assert empA1Clone.equals(empA1Clone);
        assert empA2.equals(empA2);
        assert empB1.equals(empB1);
        assert empB2.equals(empB2);
        assert subEmp.equals(subEmp);
    }
}

你的最后一行,年龄比较,是遥不可及的;您不应该使用
==
来比较字符串;您需要考虑空值

由于总体趋势似乎是要为您全面规划,下面是Eclipse的实现:

public class Employee {
    private final String firstName;
    private final int age;

    public Employee(final String firstName, final int age) {
        super();
        this.firstName = firstName;
        this.age = age;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
        return result;
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Employee other = (Employee) obj;
        if (age != other.age) {
            return false;
        }
        if (firstName == null) {
            if (other.firstName != null) {
                return false;
            }
        } else if (!firstName.equals(other.firstName)) {
            return false;
        }
        return true;
    }
}
public boolean equals(Object obj)
{
  if(obj == null)
  {
    return false;
  }
  if(this == obj)
  {
    return true; //Reference equality.
  }    
  if(this.getClass() != obj.getClass())
  {
    return false;
  }
  Employee other = (Employee) obj;
  if(firstName == null)
  {
    if(other.firstName != null)
    {
      return false;
    }
  }
  else if(!firstName.equals(other.firstName))
  {
    return false;
  }
  return age == other.age;
}
以及一系列测试:

import org.junit.Test;

public class EmployeeTest {
    @Test
    public void testEmployeeEquals() {
        final Employee nullNameEmp = new Employee(null, -1);
        final Employee empA1 = new Employee("a", 1);
        final Employee empA1Clone = new Employee("a", 1);
        final Employee empA2 = new Employee("a", 2);
        final Employee empB1 = new Employee("b", 1);
        final Employee empB2 = new Employee("b", 2);
        final Employee subEmp = new Employee("a", 1) {

        };

        assert !nullNameEmp.equals(empA1);
        assert !nullNameEmp.equals(empA1Clone);
        assert !nullNameEmp.equals(empA2);
        assert !nullNameEmp.equals(empB1);
        assert !nullNameEmp.equals(empB2);
        assert !nullNameEmp.equals(subEmp);
        assert !nullNameEmp.equals(null);

        assert !empA1.equals(nullNameEmp);
        assert empA1.equals(empA1Clone);
        assert !empA1.equals(empA2);
        assert !empA1.equals(empB1);
        assert !empA1.equals(empB2);
        assert !empA1.equals(subEmp);
        assert !empA1.equals(null);

        assert !empA2.equals(nullNameEmp);
        assert !empA2.equals(empA1);
        assert !nullNameEmp.equals(empA1Clone);
        assert !empA2.equals(empB1);
        assert !empA2.equals(empB2);
        assert !empA2.equals(subEmp);
        assert !empA2.equals(null);

        assert !empB1.equals(nullNameEmp);
        assert !empB1.equals(empA1);
        assert !empB1.equals(empA1Clone);
        assert !empB1.equals(empA2);
        assert !empB1.equals(empB2);
        assert !empB1.equals(subEmp);
        assert !empB1.equals(null);

        assert !empB2.equals(nullNameEmp);
        assert !empB2.equals(empA1);
        assert !empB2.equals(empA1Clone);
        assert !empB2.equals(empA2);
        assert !empB2.equals(empB1);
        assert !empB2.equals(subEmp);
        assert !empB2.equals(null);

        assert !subEmp.equals(nullNameEmp);
        assert !subEmp.equals(empA1);
        assert !subEmp.equals(empA1Clone);
        assert !subEmp.equals(empA2);
        assert !subEmp.equals(empB1);
        assert !subEmp.equals(empB2);
        assert !subEmp.equals(null);

        assert nullNameEmp.equals(nullNameEmp);
        assert empA1.equals(empA1);
        assert empA1Clone.equals(empA1Clone);
        assert empA2.equals(empA2);
        assert empB1.equals(empB1);
        assert empB2.equals(empB2);
        assert subEmp.equals(subEmp);
    }
}
有两点:

  • 您需要检查
    obj
    是否为
    null
  • 要比较Java中的
    String
    内容,请使用
    equals()
    ,即
    firstName.equals(other.firstName)
    。检查
    firstName
    是否为
    null
    first
  • 下面是一个改进的实现:

    public class Employee {
        private final String firstName;
        private final int age;
    
        public Employee(final String firstName, final int age) {
            super();
            this.firstName = firstName;
            this.age = age;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + age;
            result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(final Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final Employee other = (Employee) obj;
            if (age != other.age) {
                return false;
            }
            if (firstName == null) {
                if (other.firstName != null) {
                    return false;
                }
            } else if (!firstName.equals(other.firstName)) {
                return false;
            }
            return true;
        }
    }
    
    public boolean equals(Object obj)
    {
      if(obj == null)
      {
        return false;
      }
      if(this == obj)
      {
        return true; //Reference equality.
      }    
      if(this.getClass() != obj.getClass())
      {
        return false;
      }
      Employee other = (Employee) obj;
      if(firstName == null)
      {
        if(other.firstName != null)
        {
          return false;
        }
      }
      else if(!firstName.equals(other.firstName))
      {
        return false;
      }
      return age == other.age;
    }
    
    编辑:根据@Mark Peters的回答,更新类型比较,使
    等于()

  • 您需要检查
    obj
    是否为
    null
  • 要比较Java中的
    String
    内容,请使用
    equals()
    ,即
    firstName.equals(other.firstName)
    。检查
    firstName
    是否为
    null
    first
  • 下面是一个改进的实现:

    public class Employee {
        private final String firstName;
        private final int age;
    
        public Employee(final String firstName, final int age) {
            super();
            this.firstName = firstName;
            this.age = age;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + age;
            result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(final Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final Employee other = (Employee) obj;
            if (age != other.age) {
                return false;
            }
            if (firstName == null) {
                if (other.firstName != null) {
                    return false;
                }
            } else if (!firstName.equals(other.firstName)) {
                return false;
            }
            return true;
        }
    }
    
    public boolean equals(Object obj)
    {
      if(obj == null)
      {
        return false;
      }
      if(this == obj)
      {
        return true; //Reference equality.
      }    
      if(this.getClass() != obj.getClass())
      {
        return false;
      }
      Employee other = (Employee) obj;
      if(firstName == null)
      {
        if(other.firstName != null)
        {
          return false;
        }
      }
      else if(!firstName.equals(other.firstName))
      {
        return false;
      }
      return age == other.age;
    }
    
    编辑:根据@Mark Peters的回答更新类型比较,使
    等于()
    对称。

    使用

    return (((this.firstName == null || other.firstName == null)
                && this.firstName == other.firstName)
           ||
           this.firstName.equals(other.firstName))
           && age == other.age;
    
    这也处理
    null
    情况。

    使用

    return (((this.firstName == null || other.firstName == null)
                && this.firstName == other.firstName)
           ||
           this.firstName.equals(other.firstName))
           && age == other.age;
    

    这也处理
    null
    情况。

    字符串firstName应该与.equals()比较,而不是==。对于原始整数字段,==比较是正常的

    如果两个名字都一样,但年龄却不一样呢?这不应该失败吗

    类似于
    return(firstName.equals(obj.firstName))&(age==obj.age)

    当然,这并不考虑当这个.FixNead为NULL时的情况,这将导致<代码> Null PoExtExtExe> /代码>被抛出。

    如果两名员工的名字都为空,是否认为他们是平等的?如果其中一个为空,而另一个为空,该怎么办?假设两者都必须为null,或者两者都必须为String.equals(),则可以使用:

    return ((null == firstName && null == obj.firstName) 
      || (null != firstName && firstName.equals(obj.firstName)))
      && (age == obj.age);
    

    而不是你的2个返回语句。其余的看起来没问题。

    字符串firstName应该与.equals()比较,而不是==。对于原始整数字段,==比较是正常的

    public boolean equals(Object o){
       if(this==o){ //same instance, no need to check more
           return true;
       }
       if(o instanceof Employee){ //when null this will yield false
           Employee other = (Employee) o;
           return (this.name == other.name || (this.name != null && this.name.equals(other.name)) && this.age == other.age;
       }
       return false;
    }
    
    如果两个名字都一样,但年龄却不一样呢?这不应该失败吗

    类似于
    return(firstName.equals(obj.firstName))&(age==obj.age)

    当然,这并不考虑当这个.FixNead为NULL时的情况,这将导致<代码> Null PoExtExtExe> /代码>被抛出。

    如果两名员工的名字都为空,是否认为他们是平等的?如果其中一个为空,而另一个为空,该怎么办?假设两者都必须为null,或者两者都必须为String.equals(),则可以使用:

    return ((null == firstName && null == obj.firstName) 
      || (null != firstName && firstName.equals(obj.firstName)))
      && (age == obj.age);
    

    而不是你的2个返回语句。其余部分看起来还可以。

    将前面提到的所有部分放在一个答案中:

    public boolean equals(Object o){
       if(this==o){ //same instance, no need to check more
           return true;
       }
       if(o instanceof Employee){ //when null this will yield false
           Employee other = (Employee) o;
           return (this.name == other.name || (this.name != null && this.name.equals(other.name)) && this.age == other.age;
       }
       return false;
    }
    
    public boolean equals(Object obj) {
        if(this == obj) {
            return true; //Reference equality.
        }
        if(obj == null || !(obj instanceof Employee))
        {
            return false; // not the same type.
        }
    Employee other = (Employee) obj;
    return (firstName.equals(other.firstName) && age == other.age);
    }
    

    将前面提到的所有部分放在一个答案中:

    public boolean equals(Object obj) {
        if(this == obj) {
            return true; //Reference equality.
        }
        if(obj == null || !(obj instanceof Employee))
        {
            return false; // not the same type.
        }
    Employee other = (Employee) obj;
    return (firstName.equals(other.firstName) && age == other.age);
    }
    

    有一件事需要注意,我不会想象你会因为这个在考试中被扣分

    当类不是最终类时,执行
    instanceof
    通常是不好的做法。原因是
    equals()
    必须是对称的。接受子类(也可以用自己的新方面实现equals)可能会导致它不对称

    示例(我认为该示例与有效的Java2ED中使用的示例相同):

    这是一个非常微妙的问题,甚至这里的大多数回答者都没有考虑到。但这也是大多数
    equals
    的生成器(比如您最喜欢的IDE中的生成器)倾向于进行精确的类比较的原因:

      if ( this.getClass() != other.getClass() ) {
         return false;
      }
    

    当equals方法使用instanceof时,记录子类必须遵循完全相同的规范通常是一个很好的方法。

    需要注意的一件事,我不会想象你会在一次考试中被扣掉这个

    当类不是最终类时,执行
    instanceof
    通常是不好的做法。原因是
    equals()
    必须是对称的。接受子类(也可以用自己的新方面实现equals)可能会导致它不对称

    示例(我认为该示例与有效的Java2ED中使用的示例相同):

    这是一个非常微妙的问题,甚至这里的大多数回答者都没有考虑到。但这也是大多数
    equals
    的生成器(比如您最喜欢的IDE中的生成器)倾向于进行精确的类比较的原因:

      if ( this.getClass() != other.getClass() ) {
         return false;
      }
    

    当equals方法使用instanceof时,记录子类必须遵循完全相同的规范通常是一个好办法。

    您仍然不检查
    null
    。和
    String
    s应该与
    equals
    比较,而不是
    =
    @Etienne de Martel:null不是Employee的实例。@bob-请看@Tom Tresansky有趣的,我不知道。如果您使用的是Eclipse,请查看菜单Source->Generate hashCode()和equals()。然后Eclipse将自动生成一些非常健壮的代码供您学习。您仍然不会检查
    null
    。和
    String
    s应该与
    equals
    ,而不是
    =
    。@Etienne de Martel:null不是Employee的实例。@bob-请看@Tom Tresansky有趣,我不知道。如果您使用的是Eclipse,请查看