黑马程序员技术交流社区
标题:
HashSet自定义对象练习(下)
[打印本页]
作者:
itheima_llt
时间:
2015-4-14 23:51
标题:
HashSet自定义对象练习(下)
接着上面的思路:
3 重写Person类中的hashCode方法
运行程序,观察结果。
发现仍然有重复的元素,这是为什么呢?
这是因为在判断元素的哈希值之后,
如果哈希值相同,会调用equals方法判断内容是否一样。
这就要求:
4 重写equals方法.
import java.util.*;
//1 把数据存入Person,建立Person类
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*37;
}
//重写equals方法
public boolean equals(Object obj)
{
//强制转换Person类型
Person p = (Person)obj;
//判断是否为同一个人
return this.getName().equals(p.getName()) && this.getAge()==p.getAge();
}
}
//主类
class HashSetTest
{
public static void main(String[] args)
{
//1 创建HashSet集
HashSet hs = new HashSet();
//2 把Person对象存入集合
hs.add(new Person("Jack",20));
hs.add(new Person("Jack",20));
hs.add(new Person("Tom",18));
hs.add(new Person("Tom",18));
hs.add(new Person("Mike",19));
hs.add(new Person("Jane",26));
//3 取出元素
for(Iterator it = hs.iterator(); it.hasNext(); )
{
//强制转换为Person
Person p = (Person)it.next();
System.out.println(p.getName()+"---"+p.getAge());
}
}
}
复制代码
/*
运行结果:
HashSetTest对Person类方法覆盖后运行结果.jpg
(75.41 KB, 下载次数: 2)
下载附件
2015-4-14 23:51 上传
Tom---18
Jane---26
Jack---20
Mike---19
说明已经成功去重了,HashSet中已经不存在同名同年龄的人了!
总结:在HashSet中,存入元素是先判断哈希值是否一样,再判断内容是否一样!
hashset为了保证元素唯一:
1 如果元素哈希值相同,就判断equals是否为true;
2 如果哈希值不相同,不会调用equals方法。
此外,contains()和remove()等操作,HashSet都是依赖hashCode()和equals方法。
所以在类中必须重写这两个方法,才能保证元素唯一!
作者:
itheima_llt
时间:
2015-4-15 10:55
来看一看啊,给点分啊版主!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2