hashcode和equals

1、hashcode数据结构中的散列表,它的查询时间复杂度是O(1),在java中hashcode()方法是由Object类实现的本地方法,带有native关键字。

public native int hashCode();

2、hashcode一般在java中用于HashMap和HashSet(本质还是调用的hashMap的方法),为了快速的通过key查找到对应的value值。(可以去看hashmap源码分析,主要是put方法和get方法),给一个HashMap源码分析的地址。

http://blog.csdn.net/ghsau/article/details/16843543


3、在java中,使用equals方法会默认先比较对象的hashcode,所以在重写equals方法时,必须先重写hashcode,在比较两个对象是否为同一个对象时,(两个对象的hashcode不一样,则不是同一个对象,hashcode一样,再比较equals方法),默认Object中的equals方法是比较的对象的地址。

public boolean equals(Object obj) {
        return (this == obj);
    }


4、set是不允许重复元素的,他用的是hashmap的key的算法,相当于会先比较对象的hashcode

 1)如果hashcode一样,再调用equals方法,比较对象的地址,如果不一样,则添加

 2)如果hashcode不一样,则不是同一个对象,可以添加


5、测试set

 1)正常的添加对象

public static void main(String[] args) {
		Set<Animal> set = new HashSet();
		Animal am1 = new Animal(12);
		Animal am2 = new Animal(12);
		set.add(am1);
		set.add(am2);
		set.add(new Animal(12));
		set.add(new Animal(12));
		System.out.println("Animal对象的数量:"+set.size());
	}
class Animal{
	int age;
	public Animal(int age){
		this.age=age;
	}
	public int getAge(){
		return age;
	}
}
这里输出的结果是: Animal对象的数量:4


 2)重写了hashcode和equals(我这里认为年龄一样就是同一个动物对象)

public static void main(String[] args) {
		Set<Animal> set = new HashSet();
		Animal am1 = new Animal(12);
		Animal am2 = new Animal(12);
		set.add(am1);
		set.add(am2);
		set.add(new Animal(12));
		set.add(new Animal(12));
		System.out.println("Animal对象的数量:"+set.size());
	}
}
class Animal{
	int age;
	public Animal(int age){
		this.age=age;
	}
	public int getAge(){
		return age;
	}
	
	@Override
	public int hashCode() {
		
		return this.age*31+this.age;
	}
	
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if(this.hashCode()==obj.hashCode()){
			return true;
		}
		return false;
	}
}

这里输出的结果是: Animal对象的数量:1






猜你喜欢

转载自blog.csdn.net/qq_31489805/article/details/78433990