浅析hashCode()、equals()

一、equals()

equals()方法用来比较两个对象是否相等,在Object类中,equals方法和“==”一样,都是比较栈内存中存储的内存地址。再到String类,重写了equals方法后,比较的是值是否相同。所以,我们可以在自定义的类中重写equals方法来实现自定义的比较。

public class TestEqueals {

	public static void main(String[] args) {
		//测试
		Dogg d1 = new Dogg("小白","白色",2);
		Dogg d2 = new Dogg("小白","白色",2);
		Dogg d3 = new Dogg("小黑","黑色",1);
		System.out.println(d1.equals(d2)); //重写equals输出true,否则输出false(比较地址)
		System.out.println(d1.equals(d3));	//都输出false
	}
}

class Dogg{
	
	private String name;
	private String color;
	private int age;
	
	public Dogg(String name, String color, int age) {
		super();
		this.name = name;
		this.color = color;
		this.age = age;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Animal [name=" + name + ", color=" + color + ", age=" + age + "]";
	}

	/**
	 * eclipse自动生成的重写方法
	 */
	/*@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Dogg other = (Dogg) obj;
		if (age != other.age)
			return false;
		if (color == null) {
			if (other.color != null)
				return false;
		} else if (!color.equals(other.color))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}*/
	
	/**
	 * 自定义重写equals方法
	 */
	public boolean equals(Object obj){
		Dogg dogg = null;
		//1.判断传入对象是否为空
		if(obj == null){
			return false;
		}else{
			//2.不为空,再判断是否为指定类(Dogg类的子类)
			if(obj instanceof Dogg){
				dogg = (Dogg)obj;
			}
			if(this.name == dogg.name && this.color == dogg.color && this.age == dogg.age){
				return true;
			}
		}
		return false;
	}
}

二、hashCode

hashCode()方法最直接的应用就是Set、Map中,Set和List的不同点在于Set无序但是不能重复,但是每次在插入元素时刻其中的每个元素进行比较equals比较就显得不可行,效率低下,所以带用了哈希表的原理。

在插入元素时,首先根据哈希算法计算出该元素的哈希值,每个哈希值对应一片区域,如上图,再判断是否存在相同的哈希值,若没有,直接插入;若有,再和对应区域的每个元素进行equals比较,若不相等则插入。

如果两个对象相同,equals方法返回true,那么它们的hashCode一定相同。相反,如果两个对象的hashCode相同,equals方法不一定返回true。

重写equals方法必须重写hashCode方法,因为要先判断hashCode是否相等。如果重写equals方法不重写hashCode方法,在equals返回true时hashCode可能不同,或造成元素重复。

参考文章:https://blog.csdn.net/wonad12/article/details/78958411

持续更新~~~

猜你喜欢

转载自blog.csdn.net/zh137289/article/details/88707483