黑马程序员技术交流社区
标题:
HashSet的问题
[打印本页]
作者:
张学东
时间:
2012-10-17 13:27
标题:
HashSet的问题
本帖最后由 张学东 于 2012-10-17 13:29 编辑
package com.itheima.day14;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetTest {
/**
* 往hashSet集合中存入自定对像
* 姓名和年龄相同为同一个人,重复元素。
*/
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args) {
HashSet hs=new HashSet();
hs.add(new person("zhangsan",25));
hs.add(new person("lisi",26));
hs.add(new person("whangwu",27));
hs.add(new person("zhangsan",25));
Iterator it=hs.iterator();
while(it.hasNext()){
person p=(person)it.next();
sop(p.getName()+p.getAge());
}
}
}
class person{
private String name;
private int age;
person(String name, int age){
this.name=name;
this.age=age;
}
//重写object的equals方法
public boolean equals(Object obj){
if(!(obj instanceof person)){
return false;
}
person p=(person)obj;
System.out.println(this.name+"...equals.."+p.name);
return this.name.equals(p.name)&& this.age==p.age ;
}
//重写hashcode方法
public int hashCode()
{
System.out.println(this.name+"....hashCode");
return name.hashCode()+age*37;
}
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;
}
}
复制代码
谁能告诉我 在重新hashcode方法是 那个 age*37是什么意思啊 还有能给我解释这个hashCode吗?返回的hashCode怎么就是一样的呢?麻烦各位了...
作者:
刘 佳
时间:
2012-10-17 13:38
参看14天第13个视频
作者:
严海荣
时间:
2012-10-17 14:19
age*37是为了提高效率,让返回值大一些来比较,否则有可能两个对象的hashcode值会恰好相等,
这样还会去判断equals方法。只要返回的值不超过int的最大范围就可以了。
HashSet不能存放相同的元素,所以需要比较两个对象,比较对象不能用默认的equals方法比较。
这时候我们需要重写hashcode()方法和equals()方法。
当new出一个对象时,就在内存中有了自己的hash码,对象比较的时候会先比较他们的hashcode,如果hashcode
不同那么就不用比较equals了。hashcode相同,再进行equals比较,hashcode是自己重写的,
所以重写的时候,name.hashCode()+age*37 用到了对象的内容,返回的值也比较大,如果不同就很容易比较出来,
如果相同进一步比较equals。 如果自己定义的equals也一样那就表示是存入的是相同元素了,就被踢掉了。
作者:
曾浩
时间:
2012-10-17 14:23
age*37 这个37 不是固定的 只要不是1 的数都可以
1.在存数据到Set集合时 要保证数据的唯一性
2.先执行hashCode方法 在执行equals方法
3.hashCode方法是根据底层的哈希算法 来返回一个哈希值
4.假如有两个元素是同一个name 调用了hashCode方法得到一个值是相等的 这时就要调用equals方法来比较
他们的age是不是一样
5.当调用hashCode方法是返回的哈希值不一样 就不用继续调用equals方法了
方法一:public int hashCode()
{
System.out.println(this.name+"....hashCode");
return name.hashCode();
}
如果元素的name一样他们就会继续调用equals方法
方法二:
public int hashCode()
{
System.out.println(this.name+"....hashCode");
return name.hashCode()+age*37;
}
当name相同时再加上他们的age作比较 如果还想到的话就说明这两元素是同一个 就不用继续调用equals方法了这样提高了效率
age*37 原因是: name1=2 age1=5 而name2=5 age=2 虽然他们不是同一个元素但是他们在调用了方法二后返回的哈希值是相等的 为了避免这种错误的情况发生 所以在age上乘一个数
作者:
张学东
时间:
2012-10-17 14:29
曾浩 发表于 2012-10-17 14:23
age*37 这个37 不是固定的 只要不是1 的数都可以
1.在存数据到Set集合时 要保证数据的唯一性
很明确 谢谢了 .................
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2