java中==和equals的区别是什么?

什么是==?

等于比较运算符。即使他们的数据类型不相同,只要他们的值相等,也都将返回true…(在这里我们可以理解成==比较的是两个变量的内存地址)

什么是equals()?

equals()方法是Object类的方法,在Object类中的equals()方法体内实际上返回的就是使用==进行比较的结果.但是我们知道所有的类都继承Object,而且Object中的equals()方法没有使用final关键字修饰,那么当我们使用equal()方法进行比较的时候,我们需要关注的就是这个类有没有重写Object中的equals()方法.

区别

是java提供的等于比较运算符,用来比较两个变量指向的内存地址是否相同.而equals()是Object提供的一个方法.Object中equals()方法的默认实现就是返回两个对象==的比较结果.但是equals()可以被重写,所以我们在具体使用的时候需要关注equals()方法有没有被重写.

int 和 Integer(Integer范围是-128~127之间)

 public static void main(String[] args) {
        //-128 ~ +127 之间
        Integer a = 5;
        int b = 5;
        Integer c = new Integer(5);
        Integer d = 5;

        System.out.println(a.equals(b));//true
        System.out.println(a == b);//true
        System.out.println(a.equals(c));//true
        System.out.println(a == c);//flase
        System.out.println(a == d);//true

        //-128 ~ +127 之外
        a = 128;
        b = 128;
        c = new Integer(128);
        d = 128;

        System.out.println(a.equals(b));//true
        System.out.println(a == b);//true
        System.out.println(a.equals(c));//true
        System.out.println(a == c);//flase
        System.out.println(a == d);//flase
    }

重点:

System.out.println(a == d); 同样的表达式,不同的值为什么结果不同
System.out.println(a == c); 与 System.out.println(a == d); 同样的对象类型,为什么复制方式不一样,比较结果不一样
System.out.println(a == c); 与 System.out.println(a.equals©); 不同的比较方式,结果为什么不同

结论:

赋值方式中如果调用了new关键字,一定会在内存中给你分配一个新的地址
给Integer类型赋值的时候,如果没有调用new关键字,并且值在-128与+127之间,包括-128和+127,那么指向的都是同一个内存位置.
Integer类中重写了equals()方法,使用equals()方法进行比较的时候,实际上比较的内存中最终指向的值的内存位置,不是直接比较变量的内存位置.
重写的equals()方法

另一种解读

==的解读:

如果用作基本数据类型的变量,则比较的是其存储的值是否相等。
如果用作引用类型的变量,则比较的是所指向的对象的地址。

equals的解读:

public static void main(String[] args) {
        //基本数据类型的比较
        int num1 = 10;
        int num2 = 10;
        System.out.println(num1 == num2);   //true

        //引用数据类型的比较
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1 == s2);        //true
        System.out.println(s1.equals(s2));    //true

        //String类中==与equals的比较
        String s3 = new String("hello");
        String s4 = new String("hello");
        System.out.println(s3 == s4);        //false
        System.out.println(s3.equals(s4));    //true

        //没有重写类中的==与equals类型的比较  就是没有在父类中重写equals方法的类
        People p1 = new People();
        People p2 = new People();
        System.out.println(p1.equals(p2));       //false
        People p = p2;
        System.out.println(p.equals(p2));            //true
    }

解释

针对第一种的基本类型的比较,正常比较其值即可。

针对String类型的比较,这里展开说明一下,因为String类对equals()方法进行了重写。

首先创建字符串对象通常有以下两种写法:

1 String s1 = "hello";
2 String s2 = new String("world");

第一种的话在字符串常量池中创建对象,并将对象引用赋值给s1;

第二种的话通过new关键字在堆中创建对象,并将对象引用赋值给s2.
equals方法是基类Object中的实例方法,对所有继承与Object的类都会有该方法,其比较的是对象
如果类没有对equals方法进行重写,那么就是==, 即比较的对象的地址
如果类对equals方法进行了重写,一般用来比较两个对象的内容是否相等。如String中的equals()是被重写了,比较的是对象的值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值