equals用于比较两个对象是否是相同的,基本类型是比较值,引用类型是比较的地址.
但有时我们需要比较两个类是否是相同的,比较的是某些属性的值,这就要涉及到重写.
先创建一个People类
重写里面的hashCode和equals方法
public class People {
private String name;
private int age;
public People() {
super();
}
public People(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "People [name=" + name + ", age=" + age + "]";
}
// 系统自动生成的对象的唯一编号
// 1. equals 相等的两个对象hashCode必须一致
// 系统为了提高效率,HashSet等判断两个相等的时候,会先比较hashCode
// 如果一致,调用equals进行比较,如果不一致,那就认为不相同
// 重写equals方法,必须重写hashCode保证值相等对象,hashCode也相等
// 2.hashCode 相等的equals不一定相等
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) // 同一个对象进行比较肯定是相同的
return true; // 如果没有{}那么只有紧跟着if的下行一行代码在if判断内
if (obj == null) // 如果参数为空 肯定不相等
return false;
if (!(obj instanceof People)) // instance 实例化,创建对象
return false; // instanceof 判断是否是某个类的对象
// 判断obj是否是People或其子类的对象
// true是 false不是
// 排除所有错误的情况 进行值的比较
People other = (People) obj;
// obj的编译时类型是object 决定我们写代码时能够调用哪些属性和方法
// 调用不了People类的name和age属性
// 通过强制转换,把编译时类型改为People,就可以调用People的属性和方法了
// 比较两个对象属性的值,是否相等
if (age != other.age)
return false;
if (name == null) { // 如果name == null 调用equals方法会产生空指针异常
if (other.name != null) // 一个为null,另一个不为null
return false;
} else if (!name.equals(other.name)) // 取反,不相等的时候返回false
return false;
return true; // 如果能够执行到这里,说明age和name相同
}
}
再创建一个Test类
import java.util.ArrayList;
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
HashSet<String> hs1 = new HashSet<String>();
hs1.add("ABC");
hs1.add("ABC");
// HashSet 相同的元素只会添加一个,靠的是hashCode和equals方法
// 引用类型==比较的是地址,equals 默认比较的是地址
// 可以重写equals方法实现值的比较,比如String
People p1 = new People("张三",20);
People p2 = new People("张三",20);
System.out.println("p1==p2"+(p1==p2));
System.out.println("p1.equals(p2)"+(p1.equals(p2)));
HashSet<People> hs2 = new HashSet<People>();
hs2.add(p1);
hs2.add(p2);
// HashSet使用equals进行对象的比较
// 如果相同就认为是同一个对象,不再加入到Set中
for (People people : hs2) {
System.out.println(hs2);
}
ArrayList<People> al1 = new ArrayList<People>();
al1.add(p1);
// contains 也是比较值,不是比较地址
System.out.println("al1.contains(p2)" + al1.contains(p2));
// such that (o==null)?e==null:o.equals(e))
// o 为参数 e 数组中的每一个元素
// 如果参数为null 判断e 是否为null,为null返回true
// 如果参数不为null,判断o和e的值是否相等
// 进行值的比较,contains其实就是return indexOf(o)>= 0;
// 找到返回索引 找不到返回-1
System.out.println("元素在数组中的索引:" + al1.indexOf(p2));
}
}
equals方法可以根据我们的需要进行修改,以实现我们想要的比较功能.