重写了equals,请重写hashcode步骤

重写了equals,请重写hashcode方法

package web;

/**
 * 在每个重写了equals方法的类中,你必须也要重写hashCode方法。如果不这样做的话,
 * 就会违反Object.hashCode的通用约定,
 * 从而导致该类无法与所有基于散列值(hash)的集合类结合在一起正常运行。
 * hashCode()的返回值和equals()的关系如下:
        如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
        如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等
       
 * hashCode()返回该对象的哈希码值,该值通常是一个由该对象的内部地址转换而来的整数,
 * 它的实现主要是为了提高哈希表(例如java.util.Hashtable提供的哈希表)的性能。
 *
 * @author zengst
 *
 */
public class HashCodeEquals {
 public static void main(String args[]) {
  Student s1 = new Student("张三", 21);
  Student s2 = new Student("张三", 21);

  String aa="ddd",bb="ddd";
  int aah = aa.hashCode();
  int bbh = bb.hashCode();
  System.out.println(aah+"\r\n"+bbh);
  if (s1.equals(s2)) {
   System.out.println("s1的代码:" + s1.hashCode() + "  s2的代码:"
     + s2.hashCode());
  } else {
   System.out.println("不相同");
  }
 }
}


class Student {
 private int age;
 private String name;
 
 public Student() {
 }

 public Student(String name, int age) {
  this.age = age;
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int hashCode() {
  return (this.name.hashCode() + this.age) * 31;
 }

 public boolean equals(Object obj) {
  boolean result = false;
  if (obj == null) {
   result = false;
  }
  if (this == obj) {
   result = true;
  }

  if (obj instanceof Student) {
   Student stu = (Student) obj;
   if (stu.getName().equals(this.name) && stu.getAge() == (this.age)) {
    result = true;
   }

  } else {
   result = false;
  }
  return result;
 }
}