一 【==】和【equals】
1.1 比较【==】和【equals】
1.范围
== 从范围来说即可用于基本数据类型和引用数据类型的判断,Equals只可以用于引用数据类型的判断。
2.作用
== 用于基本数据类型判断时,比较的是变量的值。
== 用于引用数据类型判断时,比较的是对象的内存地址。如果两个对象的引用指向的是同一个内存地址,则返回true。
Equals方法没用被对象重写时,使用的是object的equals方法,底层还是使用==进行判断。
Equals方法被重写时,按照重写的规则进行判断。如许多类(String、Integer等类型的equals和hashcode都被重写过,Equals()比较的是内容,而非引用比较。
总结:
我们通常会使用 == 来对比两个对象的引用地址是否相同,而使用 equals 对比两个值是否相同(前提条件是重写了 equals方法)。
对于 Object 对象来说,equals 和 == 都是一样的,都是比较对象的引用是否相同。
hashCode 和 equals 两个方法是用来协同判断两个对象是否相等的,采用这种方式的原因是可以提高程序插入和查询的速度。
二 案例场景
2.1 字符串比较
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);//false
System.out.println(s1.equals(s2));//true
System.out.println("s1的hashcode:"+s1.hashCode()+" s2 的hashcode:"+s2.hashCode());//s1的hashcode:99162322 s2 的hashcode:99162322
因为字符串的hashcode和equals方法都被重写过,且两个对象的引用存储在栈中,指向堆中的不同地址,指向堆中的不同对象。但是二者内容相同(重写equals方法,比较的就是内容)
2.2 案例 自定义对象比较
public class Person | Person p1 = new Person("hello"); |
在这个例子中,即使这两个Person对象的属性值是相同的,但由于没有重写equals方法,因此"=="和"equals"都会比较对象的引用地址,从而导致返回false。
2.3 案例3 包装类
Integer num1 = 10; |
2.4 案例4 数组
int[] arr1 = {1, 2, 3}; |
https://mp.weixin.qq.com/s/GhfOJ5lbcajmTd72Y0fsEw
2.5 案例5 枚举类
enum Weekday { MONDAY, TUESDAY, WEDNESDAY } |