一、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
持续更新~~~