java中【==】和【equals】的区别和联系

一 【==】和【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
{
    //温馨提醒,
    // 本类没有覆写hashcodeequals方法
    private Integer id;
    private String  personName;

    public Person(String personName)
    {
        this.personName = personName;
    }
}

Person p1 = new Person("hello");
Person p2 = new Person("hello");
System.out.println(p1 == p2);// 结果为false,因为Point类中没有重写equals方法,所以比较的是引用地址
System.out.println(p1.equals(p2)); // 结果为false,同样是比较的引用地址

在这个例子中,即使这两个Person对象的属性值是相同的,但由于没有重写equals方法,因此"=="和"equals"都会比较对象的引用地址,从而导致返回false。

2.3  案例3 包装类

Integer num1 = 10;
Integer num2 = 10;
boolean usingEquals = num1.equals(num2); // 结果为true,因为Integer类重写了equals方法,比较的是内容
boolean usingDoubleEquals = num1 == num2; // 结果为true,因为Java缓存了-128127之间的整数对象,所以它们的引用地址相同

2.4 案例4 数组

int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
boolean usingEquals2 = Arrays.equals(arr1, arr2); // 结果为true,因为Arrays.equals方法比较的是数组的内容
boolean usingDoubleEquals2 = arr1 == arr2; // 结果为false,因为数组是不同的对象

https://mp.weixin.qq.com/s/GhfOJ5lbcajmTd72Y0fsEw

2.5 案例5 枚举类

enum Weekday { MONDAY, TUESDAY, WEDNESDAY }
Weekday day1 = Weekday.MONDAY;
Weekday day2 = Weekday.MONDAY;
boolean usingEquals3 = day1.equals(day2); // 结果为true,因为枚举类型已经重写了equals方法
boolean usingDoubleEquals3 = day1 == day2; // 结果为true,因为枚举类型的对象是唯一的

 

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值