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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李健09 中级黑马   /  2013-8-14 14:50  /  1732 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李健09 于 2013-8-16 10:36 编辑
  1. <p>import java.util.*;
  2. class Student implements Comparable<Student>
  3. //implements Comparable<Student> 是为了防止Student存入二叉树中 使其具备可序的要实现Comparable
  4. {
  5. private String name;
  6. private int age;
  7. Student(String name,int age)
  8. {
  9.   this.name=name;
  10.   this.age=age;
  11. }
  12. public int compareTo(Student s)//(Student)如存入二叉树让Student可序
  13. {
  14.   int num=new Integer(this.age).compareTo(new Integer(s.age));
  15.   if(num==0)
  16.    return this.name.compareTo(s.name);
  17.   return num;
  18. }
  19. public int hashCode()
  20. {
  21.   return name.hashCode()+age*34;
  22. }
  23. public boolean equals(Object obj)//保证元素(学生)的唯一性
  24. {
  25.   if(!(obj instanceof Student))
  26.     throw new ClassCastException("类型不匹配");
  27.   Student s=(Student)obj;
  28.   return this.name.equals(s.name) && this.age==s.age;
  29. }
  30. public String getName()
  31. {
  32.   return name;
  33. }
  34. public int getAge()
  35. {
  36.   return age;
  37. }
  38. public String toString()
  39. {
  40.   return name+":"+age;
  41. }
  42. }</p>
  43. <p> </p>
复制代码
毕老师的课件创建一个学生类
我想问下
public int hashCode()
{
  return name.hashCode()+age*34;
}
public boolean equals(Object obj)//保证元素(学生)的唯一性
{
  if(!(obj instanceof Student))
    throw new ClassCastException("类型不匹配");
  Student s=(Student)obj;
  return this.name.equals(s.name) && this.age==s.age;
}
这里面的
public int hashCode()
{
  return name.hashCode()+age*34;
}
问题一 这个函数的目的是什么 ?
问题二 return name.hashCode()+age*34;这个又表示什么呢?搞不明白了   还有这个age*34;?

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
1 这个函数是复写hashCode()
2,表示是以name的hashCode来代替原来的hashCode,age*34只是为了使hashCode()更不容易出现重复。所以你这两个问题其实就是一个问题

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
gudao20080 发表于 2013-8-14 18:08
1 这个函数是复写hashCode()
2,表示是以name的hashCode来代替原来的hashCode,age*34只是为了使hashCode()更 ...

那hashCode()就可以看做原来存在的键对吗?
回复 使用道具 举报
李健09 发表于 2013-8-15 10:03
那hashCode()就可以看做原来存在的键对吗?

hashCode()复写之后,你就可以自己设定判断键是否唯一的标准,比如说一个Person类,有name和age属性,你是认为名字相同是同一个人呢,还是年龄相同是同一个人?这里就可以通过返回name或age的hashCode来自己定义标准,不再使用默认的判断标准
回复 使用道具 举报
看到了这一题,我想到了我写过的一个差不多的代码
  1. package cn.itcase;

  2. class Person implements Comparable {
  3.         private String name;
  4.        
  5.         public String getName() {
  6.                 return name;
  7.         }
  8.         public void setName(String name) {
  9.                 this.name = name;
  10.         }
  11.        
  12.         private int ID;
  13.        
  14.         public int getID() {
  15.                 return ID;
  16.         }
  17.         public void setID(int ID) {
  18.                 this.ID = ID;
  19.         }
  20.         public String toString(){
  21.                 return name + ";" + ID;
  22.         }
  23.        
  24.         public Person(String name, int ID){
  25.                 super();
  26.                 this.name = name;
  27.                 this.ID = ID;
  28.         }
  29.        
  30.         public Person(){
  31.                 super();
  32.         }
  33.         @Override
  34.         public boolean equals(Object obj) {
  35.                 // TODO Auto-generated method stub
  36.                 Person p = (Person)obj;
  37.                 return this.name.equals(p.name) && this.ID == p.ID;
  38.         }
  39.         @Override
  40.         public int hashCode() {
  41.                 // TODO Auto-generated method stub
  42.                 int num = 38;
  43.                 return this.name.hashCode() + ID*num;
  44.         }
  45.         @Override
  46.         public int compareTo(Object o) {
  47.                 // TODO Auto-generated method stub
  48.                 Person p = (Person)o;
  49.                 if (this.ID > p.ID) {
  50.                         return 1;
  51.                 }else if(this.ID < p.ID){
  52.                         return -1;
  53.                 }else {
  54.                         return this.name.compareTo(p.name);
  55.                 }
  56.         }
  57.        
  58.        
  59.                
  60.        
  61. }
复制代码
其中关于hashCode()方法的复写是为了避免哈希值出现重复导致错误的结果,而且,所乘以的数字越大,出现错误的几率越小
回复 使用道具 举报
谢了各位
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马