欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(软件构造博客)==和equals的区别

程序员文章站 2022-03-10 14:24:02
...

==和equals的区别

之前在做软件构造实验的时候遇到了应该使用==还是equals判断相等的情况,结合上课讲的内容和查阅的资料在此记录二者的相同点和区别,如有不正确的地方请批评指正。

1. 相同点

很显然二者的相同点就是都是用来判断两个元素是否相同的,只是使用的方式以及判断的方法不同。

2.不同点

首先,最大的区别就是==是一个运算符而equals是一个函数,这是二者本质上的不同,当然,在使用的时候这不是我们需要考虑的重点。在使用的时候我们需要考虑的是:
1.对于一些基本数据类型例如byte,int等只能使用==,表示对于数值或者是基本数据类型值的比较,由于这些都是基本数据类型,因此不存在使用equals函数来比较的必要
2.对于一些复合数据类型,如果我们使用==来表示比较比较两个元素的话我们比较的是他们的存放地址的相同与否,也就是如果们new了两个复合数据类型,尽管它们内部的值可能是相同的,但是比较结果是不相同的,很显然在大多数时候这都是不符合我们的使用要求的。
3.对于复合数据类型,使用的equals都是继承自java的Object类,在不进行override的情况下比较的还是存放地址,因为Object中默认是使用==实现这个函数的,可以通过override来重写,定义我们需要的比较方式,例如Interger,Date,String等复合数据类型内部都进行了重写,不再是比较存放的地址位置。

具体例子

代码:

 //基本数据类型的比较
        int test1 = 10;
        int test2 = 10;
        System.out.println(test1 == test2);   //true
        //引用数据类型的比较
        String s1 = "test";
        String s2 = "test";
        System.out.println(s1 == s2);        //true
        System.out.println(s1.equals(s2));    //true
        //String类中==与equals的比较
        String s3 = new String("test");     
        String s4 = new String("test");
        System.out.println(s3 == s4);        //false
        System.out.println(s3.equals(s4));    //true
        //非String类中==与equals类型的比较

4.关于重写equals

一般来说,如果我们定义的一个ADT我们希望它是immutable类型的时候我们需要重写equals,这是因为很可能存在使用这个ADT,new出的两个实体由于存放的位置不同而无法使用==比较是否相等,这时候就需要重写equals,而mutable类型的ADT一般不需要重写equals方法。