equals()方法的了解|Java刷题打卡

本文正在参加「Java主题月 – Java 刷题打卡」,详情查看 活动链接

一、题目:equals() 方法详解

一文简单粗暴带你彻底搞懂equals()方法~

二、代码演示

Object.java

指示其他对象是否“等于”此对象。
equals方法在非空对象引用上实现等价关系:
它是自反的:对于任何非空的引用值x,x.equals(x)应该返回true。
它是对称的:对于任何非空的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。
它是可传递的:对于任何非空引用值x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)应该返回true。
它是一致的:对于任何非空的引用值x和y,x.equals(y)的多次调用始终返回true或false,前提是在对象的equals比较中使用的信息没有被修改。
对于任何非空引用值x,x.equals(null)应返回false。
类对象的equals方法实现了对象上最有区别的等价关系;也就是说,对于任何非空的引用值x和y,当且仅当x和y引用同一对象(x==y的值为true)时,此方法才返回true。
请注意,每当重写hashCode方法时,通常都需要重写该方法,以便维护hashCode方法的一般约定,即相等的对象必须具有相等的hash代码。
public boolean equals(Object obj) {
    return (this == obj);
}
复制代码

Integer.java

将此对象与指定对象进行比较。当且仅当参数不为null并且是包含与此对象相同的int值的整数对象时,结果才为true
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}
复制代码

三、思考分析

int a1=1;
Integer a2=new Integer("1");
Integer a3=new Integer("1");
Integer a4=1;
Integer a5=1;
Integer a6=999;
Integer a7=999;
//比较基本类型和封装类型,会转换为基本类型后比较
Assert.assertTrue(a1==a2);
//比较基本类型和封装类型,会转换为基本类型后比较
Assert.assertTrue(a1==a3);
//比较基本类型和封装类型,会转换为基本类型后比较
Assert.assertTrue(a2==a1);
//比较对象地址,new出来的显然是不同的
Assert.assertFalse(a2==a3);
//比较对象地址,这个套路比较深,java里面会的-128~127里面的整数做缓存,返回相同的对象,超出范围的才new
Assert.assertTrue(a4==a5);
//比较对象地址,这个套路比较深,java里面会的-128~127里面的整数做缓存,返回相同的对象,超出范围的才new
Assert.assertFalse(a6==a7);

Student o1=new Student(null);
Student o2=new Student(null);
Student o3=new Student("1111");
Student o4=new Student("1111");
Student o5=new Student("2222");
ArrayList<Student> list=new ArrayList();
HashSet<Student> set=new HashSet();
list.add(o1);
set.add(o1);
Assert.assertTrue(list.contains(o1));
Assert.assertTrue(list.contains(o2));
Assert.assertTrue(set.contains(o1));
//没有重写hashCode导致HashSet无法正确判断元素
Assert.assertTrue(set.contains(o2));
复制代码

四、总结

定义

它是自反的:对于任何非空的引用值x,x.equals(x)应该返回true。

它是对称的:对于任何非空的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。

它是可传递的:对于任何非空引用值x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)应该返回true。

它是一致的:对于任何非空的引用值x和y,x.equals(y)的多次调用始终返回true或false,前提是在对象的equals比较中使用的信息没有被修改。

使用

对于基本类型,==操作比较值相等对于对象类型,

比较两个对象的内存地址

对于封装类型和基本类型间的比较,编译器会转换为基本类型后再比较

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享