重写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方法是避免集合内的对象重复。
- 重写equals方法时都要重写equals方法
- 重写equals()方法
- 重写equals()方法
- JAVA重写equals方法
- JAVA重写equals方法
- 重写Equals()方法
- equals方法重写
- 重写 equals 方法
- java 重写equals方法
- 重写equals()方法简介
- 重写equals方法
- 重写equals方法
- 重写equals方法
- 重写equals方法
- 怎么样重写equals方法
- 重写Equals方法
- 重写equals方法
- 重写equals方法
- 闲话两则
- poj3661 Running
- Linux操作系统基础1
- linux嵌入式:嵌入式LINUX环境下视频采集
- android java 调用 c
- 重写equals方法
- HDU_4946_Area of Mushroom_凸包
- 漂亮的Div装饰效果
- DFS剪枝
- spring+springmvc+hibernate架构、maven分模块开发例子小项目案例
- Win下Eclipse提交hadoop程序出错Permission denied
- C++之类型转换
- 微信公众号开发环境搭建
- nyist oj 36 最长公共子序列 (动态规划基础题)