当前位置: 代码迷 >> J2SE >> hashCode(),该怎么解决
  详细解决方案

hashCode(),该怎么解决

热度:475   发布时间:2016-04-23 19:56:24.0
hashCode()
package twenty_one;
import java.io.*;
import java.util.*;
public class Nine {
public static void main(String[] args) throws IOException{
Set<Student>stus=StudentInfoTool.getStudent();
StudentInfoTool.wrToFile(stus);

}
}
class Student implements Comparable<Student>
{
private String name;
private int ma,cn,en;
private int sum;
Student(String name,int ma,int cn,int en)
{
this.name=name;
this.ma=ma;
this.cn=cn;
this.en=en;
sum=ma+cn+en;
}
public int compareTo(Student s)
{
int num=new Integer(this.sum).compareTo(new Integer(s.sum));
if(num==0)
return  this.name.compareTo(s.name );
return num;
}
public String getName()
{
return name;
}
public int getSum()
{
return sum;
}
public int hashCode()
{
return name.hashCode()+sum*78;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s=(Student)obj;
return this.name.equals(s.name)&& this.sum==s.sum;
}
public String toString()
{
return "Student["+name+","+ma+","+","+cn+","+en+"]";
}
}
class StudentInfoTool
{
public static Set<Student>getStudent()throws IOException
{
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
Set<Student>stus=new TreeSet<Student>();
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
String[] info=line.split(",");
Student stu=new Student(info[0],Integer.parseInt(info[1]),Integer.parseInt(info[2]),Integer.parseInt(info[3]));
stus.add(stu);
}
bufr.close();
return stus;

}
public static void wrToFile(Set<Student>stus)throws IOException
{
BufferedWriter bufw=new BufferedWriter(new FileWriter("D://java//workspace//heima//src//twenty_one//File//stuinfo.txt"));
for(Student stu:stus)
{//  bufw.write(stu.getName());//只出现姓名与总成绩。
bufw.write(stu.toString()+"\t");
bufw.write(stu.getSum()+"");
bufw.newLine();
bufw.flush();
}
bufw.close();
}
}


这段代码中
public int hashCode()
{
return name.hashCode()+sum*78;
}
这句话到底起什么作用啊!我把它删了但一点影响都没有啊?
大神具体说说,举例子
------解决思路----------------------
hashCode,是在使用Hash算法的时候使用的。比如HashMap,HashSet(它的内部也是HashMap实现的)
hashCode的值,就是散列值,用于使得每个元素在HashMap内部得到均匀的分布,提高HashMap搜索该元素的速度。
hashCode一般会和equals一起重写。
具体的内容请参考《Java编程思想(第四版)》第17涨 容器深入研究。
------解决思路----------------------
在《Effective Java中文版(第2版)》中的“第9条:覆盖equals时总要覆盖hashCode”中也有描述。
你把hashCode()方法删除掉,没有造成影响,是不对的。这只是因为在你的程序环境中,没有用到该class的实例作为HashMap的key。一旦你的这个class被用在HashMap的key的时候,你会发现在进行HashMap的get操作,或者进行HashMap的contains操作的时候,发现它的执行效率很低。这就是因为你没有对该class的实例进行很好的散列的原因。你这里 * 78,推荐采用“质数”,这样对散列值的效率会有明显的提高。