黑马程序员技术交流社区
标题:
HashSet的一点疑问
[打印本页]
作者:
┣┫流枫
时间:
2014-8-9 21:54
标题:
HashSet的一点疑问
本帖最后由 ┣┫流枫 于 2014-8-10 21:43 编辑
求大婶帮忙看看 咋回事输出结果还是有重复的,
中间加了不少测试代码,实在找不到原因了
代码如下:
package day17;
public class Person {
private String name;
private int score;
public Person(String name,int score){
this.name=name;
this.score=score;
}
public int hashCode(){
System.out.println("+++++hashCode++++"+name.hashCode()+score*2);
return name.hashCode()+score*12;
}
public boolean equals(Object obj){
System.out.println("=====equals======");
if (this==obj) {
return true;
}
if(obj==null){
return false;
}
if(obj instanceof Person){
Person per =(Person) obj;
return this.name.equals(per.equals(name))&&this.score==per.score;
}
return false;
}
public String toString(){
return "Person "+this.name+" "+this.score;
}
}
复制代码
测试函数:
package day17;
import java.util.*;
public class HashSetDemo {
public static void main(String[] args) {
HashSet hs=new HashSet();
hs.add(new Person("lisi",23));
hs.add(new Person("lisi",23));
hs.add(new Person("lisi1",111));
hs.add(new Person("lisi1",23));
Iterator it=hs.iterator();
while (it.hasNext()) {
Person p=(Person)it.next();
System.out.println(p);
System.out.println(p.equals(p));
// System.out.println(it.next());
}
}
}
复制代码
输出结果:
+++++hashCode++++332200346
+++++hashCode++++332200346
=====equals======
=====equals======
+++++hashCode++++102982142222
+++++hashCode++++10298214246
Person lisi1 23
=====equals======
true
Person lisi 23
=====equals======
true
Person lisi 23
=====equals======
true
Person lisi1 111
=====equals======
true
复制代码
作者:
fxwb2005
时间:
2014-8-9 22:23
本帖最后由 fxwb2005 于 2014-8-9 22:28 编辑
return this.name.equals(per.equals(name))&&this.score==per.score;
这句里面你拿per去和name比?应该是:
return this.name.equals(per.name)&&this.score==per.score;
作者:
地狱天堂
时间:
2014-8-9 22:24
Person类,第25行
改为:return this.name.equals(per.name)&&this.score==per.score;
作者:
┣┫流枫
时间:
2014-8-9 22:28
fxwb2005 发表于 2014-8-9 22:23
if (this==obj) {
return true;
}
上面那几行,Java里的源码就有的哦。如果是本身,直接true,如果是null 直接false 就不用比较了
我看String类复写的Object 都是这么写啊
作者:
一顿一只牛
时间:
2014-8-9 22:31
import java.util.HashSet;
import java.util.Iterator;
/*
* 往hashSet集合中存入对象
* 姓名和年龄视为重复元素。
*
*
* */
public class hashSet {
public static void main(String[] args){
HashSet hs = new HashSet();
hs.add(new person("one",20));
hs.add(new person("two",20));
hs.add(new person("one",20));
hs.add(new person("san",22));
hs.add(new person("san",22));
hs.add(new person("san",23));
//迭代器,输出集合。
Iterator it = hs.iterator();
while(it.hasNext()){
person p = (person)it.next();
System.out.println(p.getName()+"___"+p.getAge());
}
}
}
class person{
private String name;
private int age;
person(String name , int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
//hashCode方法
public int hashCode(){
return name.hashCode()+age;
}
//自定义比较方法,比较名字和年龄。
public boolean equals(Object obj){
if(!(obj instanceof person))
return false;
person p = (person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
}
复写equals方法这样代码阅读性比较高吧
if(!(obj instanceof person))
return false;
person p = (person)obj;
return this.name.equals(p.name) && this.age == p.age;
判断的时候写错了,比较时出错
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2