覆写equals需要覆写hashcode吗 本帖最后由 meifage 于 2011-08-14 13:10:10 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果不用到Set时,不用重写这两个的,我们知道Set中的元素不能有重的,那么什么叫重复的元素呢?如果说不同的对象就是不重复的,那么你可以试一下:Set set = HashSet();String str1 = new String("hello");String str2 = new String("world");set.add(str1);set.add(str2);System.out.println(set.size());str1与str2是不同的对象,当我们往set中放入时,如果是不同的对象就是不重复的,那么set中就有两个元素,然而我们打印set时,里面只有一个元素。当然是不是同一个对象是set判断元素是否重复的一个条件。其实set判断是不是重复的对象,它首先要看如果两个对象的hashcode的值不一样,那么就是不同的对象,两个都可以存入,如果hashcode的值是一样的那么,还要调用两个对象的equals方法,如果返回true,那么这两个元素就重复了。所以当我们要放入元素到set中的时候,我们就要同时重写hashCode() ,和equals()方法。来共同确定是不是重复的元素。比如下面这个例子:package com.cn;import java.util.HashSet;public class HashSetTest { public static void main(String[] args) { HashSet<Student> set = new HashSet<Student>(); Student s1 = new Student("zhangsan"); Student s2 = new Student("zhangsan"); set.add(s1); set.add(s2); System.out.println(set); }}class Student { String name; Student(String name) { this.name = name; } public int hashCode() { return this.name.hashCode(); } public boolean equals(Object obj) { if (this == obj) { return true; } if (null != obj && obj instanceof Student) { Student s = (Student)obj; if (name.equals(s.name)) { return true; } } return false; }} 我们的目的是,如果名字一样了,在集合中就算是重复的对象了。 找你的方法的话,如果是要放到集合中,那么如果不重写hashCode方法,那么这两个对象都可以放到集合中去。尽管我们希望看到的是这两个对象是重复的。 API中说的是协定,什么叫协定?就是一个约定,不遵守这个约定就有可能出问题,如使用hashMap,hashset时 lz这代码只要重写equals()就可以了。。 一般情况下前面带Hash的重写,像Hashset,HashMap等等,因为它们是以哈希表实现的,涉及到一个冲突解决问题,所以要重写hashcode,可以去看看数据结构 异常处理问题的困惑 求一个Java学习计划路线 有关运行问题 不能连接到VM 很简单的问题 判断闰年? 请问哪儿可以找到带有具体实例的java帮助文档? 大家能帮帮我吗?关于一个RMIC的问题 菜鸟求救!(non-static variable this cannot be referenced from a static context) 紧急求救:java的基本类int怎样转化为String类 菜鸟请教 i-- 和 i-1 输出结果不相同是为什么, 关于数组排序,我实现了Comparable接口,没有成功
Set set = HashSet();
String str1 = new String("hello");
String str2 = new String("world");set.add(str1);
set.add(str2);
System.out.println(set.size());str1与str2是不同的对象,当我们往set中放入时,如果是不同的对象就是不重复的,那么set中就有两个元素,然而我们打印set时,里面只有一个元素。当然是不是同一个对象是set判断元素是否重复的一个条件。其实set判断是不是重复的对象,它首先要看如果两个对象的hashcode的值不一样,那么就是不同的对象,两个都可以存入,如果hashcode的值是一样的那么,还要调用两个对象的equals方法,如果返回true,那么这两个元素就重复了。所以当我们要放入元素到set中的时候,我们就要同时重写hashCode() ,和equals()方法。来共同确定是不是重复的元素。比如下面这个例子:
package com.cn;import java.util.HashSet;public class HashSetTest {
public static void main(String[] args) {
HashSet<Student> set = new HashSet<Student>();
Student s1 = new Student("zhangsan");
Student s2 = new Student("zhangsan");
set.add(s1);
set.add(s2);
System.out.println(set);
}
}
class Student {
String name;
Student(String name) {
this.name = name;
}
public int hashCode() {
return this.name.hashCode();
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (null != obj && obj instanceof Student) {
Student s = (Student)obj;
if (name.equals(s.name)) {
return true;
}
}
return false;
}
}
我们的目的是,如果名字一样了,在集合中就算是重复的对象了。