1. 什么是hashcode和equals方法

   这里首先明白一个问题,比较两个对象,如果他们的equals想等,那么他们的hashcode一定相等,而如果他们的hashcode相等的话,他们的equals不一定相等这是为什么呢?

当比较两个对象时,先比较他们的hash码,再比较他们的equals方法

所以光重写equals方法或者hashcode方法是没用的,必须两个同时重写。

2.为什么要重写hashcode()和equals()方法

   Stringinteger自带了hashcode()equals方法,而我们自己写的类不带有,当出现下列情况时(有类A

A a = new A(1);

A b = new A(1);

这样产生的两个对象的hash码是不一样的。

 

  1. 怎么重写
    class B
    {
    	private int i;
    	
    	public B(int i)
    	{
    		this.i = i;
    	}
    	
    	public boolean equals(Object ob)
    	{
    		B bb = (B)ob;
    		return this.i == bb.i;
    	}
    	
    	public int hashCode() //Integer(1)
    	{
    		return new Integer(i).hashCode(); 
    	}
    }
    
    class Student
    {
    	private int id;
    	private String name;
    	
    	public Student(int id, String name)
    	{
    		this.id = id;
    		this.name = name;
    	}
    	
    	public int hashCode()
    	{
    		//return new String(name+id).hashCode();
    		return id * name.hashCode();
    	}
    }
    
    public class TestHash
    {
    	public static void main(String[] args)
    	{
    //		B bb1 = new B(1);
    //		B bb2 = new B(10);
    //		System.out.println(bb1.equals(bb2));  //true
    //		System.out.println(bb1.hashCode() == bb2.hashCode()); // false
    	
    		Student st1 = new Student(1, "1111");
    		Student st2 = new Student(1, "1111");
    		System.out.println(st1.hashCode() == st2.hashCode()); //
    		
    	}
    }
    

      

    class Student {  
        int num;  
        String name;  
      
        Student(int num, String name) {  
            this.num = num;  
            this.name = name;  
        }  
      
        public int hashCode() {  
            return num * name.hashCode();  
        }  
      
        public boolean equals(Object o) {  
            Student s = (Student) o;  
            return num == s.num && name.equals(s.name);  
        }  
      
        public String toString() {  
            return num + ":" + name;  
        }  
    }