A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王桂丽 中级黑马   /  2012-8-29 12:13  /  1697 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*
往hashSet集合中存入自定义对象。
姓名和年龄相同为同一个人,重复元素。
*/


一、因为new出来的对象hash值不同,直接存储,不会调用equals方法,所以复写了hashCode值,让返回的值一样,会调用equals方法

import java.util.*;
class  Student
{
private String name;//定义私有姓名,年龄,成绩三个属性
private int age;
  Student(String name,int age)//通过构造函数进行初始化
{
  this.name=name;
  this.age=age;
}
public  void setName(String name)//分别提供set和get方法
{
  this.name=name;
}
public  String getName()
{
  return name;
}
public  void setAge(int age)
{
  this.age=age;
}
public  int getAge()
{
  return age;
public boolean equals(Object obj)//覆盖equals方法
{
  if(!(obj instanceof Student))
   return false;
  Student p=(Student)obj;
  return this.name.equals(p.name)&&this.age==p.age&&this.score==p.score;
}
public int hashCode()
{
   return name.hashCode()+age;
}

}
}

}
class SortScore
{
public static void main(String[] args)
{
  HashSet s=new HashSet();
  s.add(new Student("张三",36));
  s.add(new Student("李四",35));
  s.add(new Student("赵六",34));
  s.add(new Student("王五",32));
Iterator it=s.iterator();
while(it.hasNext())
{
    Student p=(Student)it.next();
    System.out.println(p.getName()+"::"+p.getAge());
}


二、覆盖了hashcode中return name.hashCode()+age,hash值不一样,那跟不覆盖hash值结果一样(不覆盖之前返回的哈希值不同),不会调用equals方法,那这样有何意义呢?
import java.util.*;
class  Student
{
private String name;//定义私有姓名,年龄,成绩三个属性
private int age;
  Student(String name,int age)//通过构造函数进行初始化
{
  this.name=name;
  this.age=age;
}
public  void setName(String name)//分别提供set和get方法
{
  this.name=name;
}
public  String getName()
{
  return name;
}
public  void setAge(int age)
{
  this.age=age;
}
public  int getAge()
{
  return age;
public boolean equals(Object obj)//覆盖equals方法
{
  if(!(obj instanceof Student))
   return false;
  Student p=(Student)obj;
  return this.name.equals(p.name)&&this.age==p.age&&this.score==p.score;
}
public int hashCode()
{
   return name.hashCode()+age;
}
}
}

}

}
class SortScore
{
public static void main(String[] args)
{
  HashSet s=new HashSet();
  s.add(new Student("张三",36));
  s.add(new Student("李四",35));
  s.add(new Student("赵六",34));
  s.add(new Student("王五",32));
Iterator it=s.iterator();
while(it.hasNext())
{
    Student p=(Student)it.next();
    System.out.println(p.getName()+"::"+p.getAge());
}



4 个回复

倒序浏览
重复发帖,抓起来。。。
回复 使用道具 举报
你不复写hashCode,那么new 出来的四个对象的内存地址不一样,hashCode值是不一样,hashCode值不一样,当然不会调用equals方法。下面是原理
关于Object类的hashCode()方法的特点:
a) 在Java应用的一次执行过程当中,对于同一个对象的hashCode方法的多次调用,
他们应该返回同样的值(前提是该对象的信息没有发生变化)。
b) 对于两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode
值一定是相同的。
c) 对于两个对象来说,如果使用equals方法比较返回false,那么这两个对象的hashCode
值不要求一定不同(可以相同,可以不同),但是如果不同则可以提高应用的性能。
d) 对于Object类来说,不同的Object对象的hashCode值是不同的(Object类的hashCode
值表示的是对象的地址)。
4. 当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的
hash code值是否与增加的对象的hash code值一致;如果不一致,直接加进去;如
果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进
去了,就不会再增加新的对象,否则加进去。
5. 如果我们重写equals方法,那么也要重写hashCode方法,反之亦然。

回复 使用道具 举报
此问题已解决
回复 使用道具 举报
唐志兵 发表于 2012-8-29 12:21
重复发帖,抓起来。。。

代码相似,但问的是不同的问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马