java中“==“和equals()的区别:这样答面试官直呼内行!

本文详细解析Java中==运算符与equals()方法的用法差异,涵盖基本数据类型、引用数据类型以及自定义类的equals重写。理解两者在比较对象地址和内容上的区别,提升面试技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

★ 为重点,面试中这样答就很完美~

== 运算符:

== :它是个运算符,“等于”

可以使用在基本数据类型变量引用数据类型变量中;

★ 如果比较的是基本数据类型变量:比较两个变量保存的数据(值)是否相等。(类型不一定非要一样,除了boolean型与其他类型不能比,其他基本数据类型相互之间都能比);

public class Test {
    public static void main(String[] args) {
        int a = 20;
        int b = 20;
        double c = 20.0;
        System.out.println(a == b);//true;int和int比
        System.out.println(a == c);//true;int和double比

        boolean d = true;
        //编译报错;boolean型不能和其他基本数据类型比较
//        System.out.println(a == d);//int和boolean比

        char e = 20;
        System.out.println(e == a);//true;
        
        char f = 'a';//'字符a'的ASCII码表中对应数字97
        char g = 97;//把97赋给char型的变量g
        System.out.println(f == g);//true
    }
}

★ 如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.也就是栈空间中的两个引用(对象名)是否指向堆空间中同一个对象实体;

举例:创建一个Person类,声明两个属性并提供有参构造器,然后测试:

public class Test {
    public static void main(String[] args) {
        //我们自定义的Person类(引用数据类型)

        Person p1 = new Person("Harry", 18);
        Person p2 = new Person("Harry", 18);
        System.out.println(p1 == p2);//false;因为new的是两个对象实体

        //java中自带的String类
        String s1 = new String("Harry");
        String s2 = new String("Harry");
        System.out.println(s1 == s2);//false;比较的是地址值s1,s2两个地址值不一样

        //其他的引用数据类型(类,接口,数组)都一样......
    }
}

equals()方法:

equals()的使用:

是一个方法,而不是运算符;只能适用于引用数据类型中

Object类中equals()的定义:(查看源码发现):

public boolean equals(Object obj) {
        return (this == obj);
  }

★ Object类中定义的equals()方法和"=="的作用是相同的:比较两个对象的地址值是否相同.

举例:

public class Test {
    public static void main(String[] args) {
        //我们自定义的Person类(引用数据类型)

        Person p1 = new Person("Harry", 18);
        Person p2 = new Person("Harry", 18);


        System.out.println(p1.equals(p2));//false;
        // Person类的父类是object类,object类中的equals方法没有重写,还是比较的是对象的地址值;

        //java中自带的String类
        String s1 = new String("Harry");
        String s2 = new String("Harry");

        System.out.println(s1.equals(s2));//true;
        //String类中重写了equals方法,点进源码发现是对具体对象的内容的比较,而不是地址值了;

        //java中的Date类
        Date d1 = new Date(123456L);
        Date d2 = new Date(123456L);
        System.out.println(d1.equals(d2));//true;
        //Date类中也重写了equals方法,在这也比较的是具体的内容

		
        //其他的引用数据类型(类,接口,数组)都是一样就不一一举例了......

    }
}

★ 像String、Date、File、包装类…等都是重写了Object类中的equals()方法。重写以后,比较的不是两个引用的地址是否相同,而是比较两个对象的"具体内容"是否相同

★ 通常情况下,我们自定义的类如果使用equals()的话,也通常是比较两个对象的"具体内容"是否相同。那么,我们就需要对Object类中的equals()进行重写.

重写的原则:比较两个对象的实体内容是否相同.

重写在编译工具中自带generate方法重写equals()方法和hashCode()方法;

总结:(图):

在这里插入图片描述

继续加油 ~ 冲冲冲 ~~! !

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值