object类中的equals与自定义equal方法详解
1.this怎么理解?this == obj表示什么?
this就是当前你new出来的对象,这里指谁调用equal方法this指的就是谁,obj是传入参数即Object类型的类。
this == obj表示你传的对象是否和当前你要比对的对象是否相等
2.使用关系运算符==判断两个变量是否相等时:
1)如果两个变量相等,说明这两个变量引用堆中同一个对象
2)如果想要判断堆中两个对象的内容是否一样,即各个成员变量的值是否一样,需要重写equals()方法,根据哈希约定,如果两个对象的
equals()相等,那么这两个对象的hashCode()也相等,即在重写equals()方法的同也重写hashCode()。
3.Object 类中的 equals() 方法
/*Object 类中的 equals() 方法*/
Object 类中的 equals() 方法
public boolean equals(Object obj) {
return (this == obj);
}
4.自定义 euqals() 方法
/*自定义 euqals() 方法*/
public boolean equals(Object obj) {
/*
*第一种情况:当前对象的类与参数对象的类一样
persion p1 = new persion("小红",28,"女");
persion p3 = p1;
System.out.println(p1.equals(p3));
谁调用equal方法this指的就是谁,这里this指的是p1。
*/
if (this == obj)
return true;
/*
* 第二种情况:参数对象为null
p3 = null;
System.out.println(p1.equals(p3));
*/
if (obj == null)
return false;
/*
* 第三种情况:当前对象的类与参数对象的类不一样
String s1 = “hello”
System.out.println(p1.equals(p3));
注意:getClass():返回对象的运行实例(准确说是字节码文件)
*/
if (getClass() != obj.getClass())
return false;
/*
* 第四种情况:都是persion对象,但是他们里面字段不一样,也返回false
persion p1 = new persion("小红",28,"女");
persion p3 = new persion("张三,28,"男");
System.out.println(p1.equals(p3));
*/
persion other = (persion) obj;//obj为object类型,需要强制转换为persion类型
/*判断age*/
if (age != other.age)//年龄不相等返回false
return false;
/*判断gender*/
if (gender == null) {
if (other.gender != null)//当前对象的gender为null,参数对象的gender不为null,返回false
return false;
} else if (!gender.equals(other.gender))//当前对象的gender不为null,但与参数对象的gender不相等,返回false
return false;
/*判断name*/
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
5.执行结果