对比类型面试题1(equals()与==的区分)

本文解析了Java中==与equals()的对比,包括它们的适用范围、操作原理,以及在不同情况下的行为差异。重点讲解了基本类型与引用类型、常量池和对象重写equals方法的影响,提供实际编程中的选择建议。
摘要由CSDN通过智能技术生成

建议回答时包括:

多个对比项有什么相同、相似之处

多个对比项的区别

在应用中应该如何选取(重要)

可能的话,加入一些扩展(对相关知识点的理解)

一.==与equals的区别

首先我们应明确几个问题

1.变量与对象是2个不同的概念

Object a =new Object();

以上代码中a就是变量,在内存中实际存在的数据就是对象

2.所有引用类型的变量值都是引用地址

假设某对象在内存中的地址是0*6528,则变量的值就是0*6528

有了相关的概念之后开始比较

  • ==与equals()的相同/相似之处

这俩者都是用于比较2个变量是否“相同”的

  •   ==与equals()的区别
  1. ==是基本运算符,适用于所有类型的变量与变量的对比
  2. equals()是Object类定义的方法,由于Object是java的基类(所有类的父类),所以,任何对象都可以调用equals()方法实现对比,但是,基本数据类型并不是对象,无法调用该方法实现对比

==对比的是变量的值

如果是基本数据类型对比的是字面值

如果是引用数据类型,对比的是引用地址

  public static void main(String[] args) {
        int a =100;
        int b =100;
        int c =200;
        System.out.println(a==b);//true
        System.out.println(a==c);//false
    }

 因为是new出来的,我们假设地址,对比的也是地址

        Object a1 =new Object();
        Object b1 =new Object();
        System.out.println(a1==b1);//false

 赋值符号就是在栈内存进行值的赋值(引用地址)

        Object a =new Object();
        Object b=a;
        System.out.println(a==b);//true

 

 

 equals():

equals只是一个方法,到底返回true或false取决于方法的实现

默认情况下(根据Object)的定义,它与==的结果是相同的

        Object a =new Object();
        Object b=new Object();
        System.out.println(a==b);//false
        System.out.println(a.equals(b));//fasle
        Object a =new Object();
        Object b=a;
        System.out.println(a==b);//true
        System.out.println(a.equals(b));//true

   

     方法可以被重写没在java中,许多类都重写里equals()方法,例如:String.包装类,日期等

尽管是不同的对象,但是equals()的结果可能是true

       String a = new String("Tedu");
        String b = new String("Tedu");
        System.out.println(a == b);//false,==比的就是内存的地址
        System.out.println(a.equals(b));//true,他取决去String这个类对equals方法的重写

 下面是String类对equals重写的源代码

 

 

  • 特殊情况:

由于java对常量池的特殊处理,还有些特殊情况:

直接声明的字符串使用==对比也是成立的

        String c ="abc";
        String d ="abc";
        /*c d都是指向常量池的“abc”*/
        System.out.println(c==d);//true

使用[-128,127]区间值对整型包装类对象使用==对比也是成立的(-128到127之间包装类直接用==对比,只要字面值相同一定相同,当然还是推荐用equals来对比)

        Integer a=-129;
        Integer b=-129;
        System.out.println(a==b);//false

        a=-128;
        b=-128;
        System.out.println(a==b);//true

        a=127;
        b=127;
        System.out.println(a==b);//true

        a=128;
        b=128;
        System.out.println(a==b);//false

总结:

相同之处:

都是对比2个数据是否相同

不同之处:

==符号可以对比所有数据,而equals()只能被对象调用;==符号对比变量的值是否相同,所以基本类型的变量只要字面值相同即返回true,引用类型的变量仅当引用地址相同时才返回true;equals()方法是Object定义的,默认使用==实现对比,所以,当该方法没有被重写时,执行效果与==相同没如果被重写则取决于重写的代码,以String对象为例,在执行equals()将琢一对比字符串的每个字符,所以,只要2个String对象的字符完全相同,2个String对象使用equals()对比将返回true;

  • 补充说明:

    由于java会在编译期处理常量并且,常量池中的每个常量都是唯一的,所以,没当使用字符串常量直接对变量赋值,或使用【-128,127】区间值对Byte/Short/Integer/Long 类型的对象赋值时没使用==对比的结果也是true

  • 实际应用原则:

   在实际编写代码时,对于基本数据类型的变量,必须使用==进行对比,因为基本数据类型的变量不可以调用equals()方法;对于引用数据类型的变量,推荐(必须)使用equals()进行对比,并且,在有必要的情况下,如果这个类使我们声明的,我们应该重写equals()方法,使之返回结果的规则符合当前编写代码的需求,在重写时,至少保证同一个对象的对比结果为true(说白了即:如果==对比为true时,则equals()对比返回true)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liamlf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值