重写equals方法

来源:互联网 发布:剑三正太和尚脸型数据 编辑:程序博客网 时间:2024/05/17 09:04

重写equals方法

 

1、equals方法和==

ü 对于基础类型而言,“==”比较的是基础类型的值。对于对象而言,“==”比较的是引用,即对象的内存地址。

ü equals()方法在Object基类中,其内部使用“==”实现的。在很多类中重写了equals方法,因此很多类中重写了该方法用于实现对象相等。比如:string类等。

 

2、什么时候需要重写equals方法

第一种情况:如果类中提供的equals方法无法满足需求,则需要重写equals方法。

第二种情况:对于采用哈希算法的集合,集合中对象必须重写hashCode方法,同时也要重写equals方法。注意在重写equals方法的时候,函数的返回值、参数类型和参数个数必须相同,类的权限访问可以不同,但是子类重写父类的方法时,访问控制权限必须大于父类。

比如:public boolean equals(Object o)与public boolean equals(String o),构成不了重写,构成的只是重载。假如父类有方法private boolean equals(Object 0),子类这样重写public boolean equals(Object 0),可以构成重写。

 

3、对象相等的含义:对象的类型相同,对象的某个属性相同(如果重写该方法需要自己去决定哪个属性相同)。

对象相等的判断:

ü equals(参数)函数中的参数不能为空,需要进行判断。

ü 判断两个对象的类类型是否相同。两种方式:第一种判断对象的类字节码是否相同;第二种使用instanceof关键字,判断左边的对象是否为右边类的实例对象。

ü 根据自己的需求决定哪个属性相同。

示例一:重写equals方法

private String username;

private Stringpassword;

private Stringgender;

private int age;

方法

public User(String username,String password,String gender,int age) {}

public void setUsername(String username) {}

public void setPassword(String password) {}

public void setGender(String gender) {}

public void setAge(int age) {}

public String getUsername() {}

public String getPassword() {}

public String getGender() {}

public int getAge() {}

public boolean equals(Object obj) {}

 

public boolean equals(Object obj) {

      //判断obj是否为空

      if(obj ==null) {

         returnfalse;

      }

      //判断是指向同一对象

      if(this == obj)

         return true;

      //判断两个对象类型是否相同

      if(obj.getClass() ==this.getClass()) {

//也可以这么写 if(obj instanceof Users):obj是否为Users的实例对//象。

         //类型转换

         User u = (User)obj;

         //根据自己需要以什么条件判断属性值相等,这里以用户名相等就认为对象相等

         if(this.getUsername().equals(u.getUsername()))

         //getUsername()返回一个String类型,String已实现了equals方法,所有上面可以这么比较

            returntrue;

         else

            returnfalse;

      }else

         returnfalse;

}

 

示例二:重写hashCode方法和equals方法

import java.util.*;

 

public class HashSetTest {

  

   public static void main(String[] args) {

      HashSet<Student> hs = new HashSet<Student>();

      Student s1 = new Student("zhangsan","female");

      Student s2 = new Student("lisi","male");

      Student s3 = new Student("zhangsan","female");

      Student s4 = new Student("wangwu","male");

      Student s5 = new Student("xiaojuan","female");

     

      hs.add(s1);

      hs.add(s2);

      hs.add(s3);

      hs.add(s4);

      hs.add(s5);

     

      Iterator<Student> iter =hs.iterator();

      while(iter.hasNext()) {

         System.out.println(iter.next());

      }

     

   }

  

}

 

class Student {

   private Stringname;

   private Stringsex;

  

   public Student(String name, String sex) {

      this.name = name;

      this.sex = sex;

   }

  

   public boolean equals(Object obj) {

      if(obj ==null)

         return false;

     

      if(obj.getClass() == Student.class) {

         Student stu = (Student)obj;

        

         return (this.name.equals(stu.name))&&(this.sex.equals(stu.sex));

      }

      return false;

   }

 

   public int hashCode() {

      return (this.name.hashCode()+this.sex.hashCode());

   }

 

 

 

   public String getName(){

      return this.name;

   }

  

   public String getSex() {

      return this.sex;

   }

  

   public String toString() {

      return "name:" + this.name +" sex:" + this.sex;

   }

}

输出:name:xiaojuansex:female

name:lisi sex:male

name:zhangsan sex:female

name:wangwu sex:male

 

如果没有重写hashCode方法和equals方法,输出:

name:lisi sex:male

name:zhangsan sex:female

name:zhangsan sex:female(重复)

name:xiaojuan sex:female

name:wangwu sex:male

 

为什么要重写hashCode方法和equals方法?

在采用hash算法的集合中,会根据对象的哈希码值将其分到某块区域中。当将某一对象放入集合中,集合会根据对象的哈希码值找到某块区域,然后将这块区域的所有对象与对象调用equals方法进行比较,如果两个对象相等,则对象不会放入集合中;如果对象不相等,对象放在此集合中。实际上重写hashCode方法就是提高采用哈希算法的集合的存储效率问题,重写equals方法是避免集合内的对象重复。

0 0
原创粉丝点击