toString、hashCode、equals的重写原因与重写示例
来源:互联网 发布:js 模拟表单上传文件 编辑:程序博客网 时间:2024/05/18 01:04
问题一:我们自定义类中的toString()、hashCode()和equals(Objectobj)均继承自Object,其中equals()方法是比较两对象的地址是否相同,hashCode()方法返回的是该对象本身的内存地址。但这个需求不能满足我们的需求。如问题二。(JDK中其它类都已重写了上述方法,不作考虑)
问题二:在我们往HashSet中添加自定义对象的时候(HashSet中不能添加相同的对象),HashSet会先将已存在的对象与欲添加的对象进行一一对比,相同的对象不允许再添加。其比较规则为:如果两对象的hashCode()方法返回值不一样,肯定不是相同的对象,可添加;如果hashCode()一样,则再判断equals()返回是否为真,不为真则肯定不是相同的对象,可添加,为真由证明两对象完全相同,不再添加到HashSet中。那按Object()中的hashCode()方法,则只要内存不一样,则两对象的hashCode就不一样,则认为两对象不相同,可往HashSet中添加,这违背了我们实际需求。
结论:我们自定义类如果想往HashSet等集合中添加时,必须重写equals(Object obj)和hashCode()方法,使相同内容的对象其equals(Object obj)为真,返回的hashCode()一致。如下:
public class Stu {
private String name;
private int age;
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Stu)){
return false;
}
if(obj==null){
return false;
}
Stu tmp=(Stu)obj;
if(tmp.age!=this.age && !tmp.name.equals(this.name)){
return false;
}
return true;
}
@Override
public int hashCode() {
return this.age*this.name.hashCode();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试类:
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
Stu s1=new Stu();
s1.setAge(18);
s1.setName("abc");
Stu s2=new Stu();
s2.setAge(18);
s2.setName("abc");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
HashSet set=new HashSet();
set.add(s1);
set.add(s2);
System.out.println(set.size());
}
}
在上面的测试中两对象的年龄与姓名均一致,但其内存地址不一样。所以用"=="为假,用equals为真,返回的set.size()为1,即往HashSet中只能添加进一个对象。至于toString()方法较为简单,不多说了……
- toString、hashCode、equals的重写原因与重写示例
- Java toString equals hashCode 方法的重写
- equals、hashCode、toString 方法重写
- 重写hashcode和equals的原因探究
- 重写equals()与hashCode()
- 重写equals方法一般需要重写hashCode方法的原因
- 重写equals()方法就必须重写hashCode()方法的原因
- 重写hashCode与equals方法的作用
- 重写hashCode与equals方法的作用
- Java 重写 equals 与 hashCode 的注意事项
- 重写hashCode与equals方法的作用
- 重写hashCode与equals方法的作用
- java-重写hashCode与equals
- equals,hashCode,compareTo的重写
- Hashcode和equals的重写
- equals和hashcode的重写
- 详解重写equals()方法就必须重写hashCode()方法的原因
- 详解重写equals()方法就必须重写hashCode()方法的原因
- MyEclipse 7.0注册码
- 架构设计师与SOA
- 如何在ActiveX控件中使用字体3
- Oracle 临时表的创建与应用
- Step by step learn PPC-----1-----开发环境
- toString、hashCode、equals的重写原因与重写示例
- how-to-use-custom-cursors
- 如何更改服务器身份验证模式
- 富士康面试经历
- 使用VC6和com控制excel的一些方法 (试验有效)
- 未能加载文件或程序集system.web.extensions解决方法
- ==, .equals(), compareTo(), and compare() (之一)
- 小测SQLite内存与非内存万条插入
- Android Bind Service机制详解