理一理java与C#中的equals方法和“==”来进行相等判断

前言:相信网上类似的博客很多了,但两种语言的这个对比着来理解的很少,最近在做C#项目时产生了这个想法,今天写这篇博客是为了帮助自己不会忘记,也希望能帮助到看到这篇文章的你。谈到对比,那肯定这两种语言中的equals和==有点儿不一样,嘿嘿,怎么个不一样,我们下面来看看。


一、java中的equals和==

1.你若不对“==”运算符进行重操作,那进行的就是栈空间值类型的比较,如:

理一理java与C#中的equals方法和“==”来进行相等判断

                                                                   图(1)

 

理一理java与C#中的equals方法和“==”来进行相等判断

                                     图(2)

所以,也就是 2和3的比较,不相等返回false。

对应的,你若用“==”运算符来比较引用类型的变量会如何呢?

理一理java与C#中的equals方法和“==”来进行相等判断

                                                                       图(3)

答案是false,原因如下图:

理一理java与C#中的equals方法和“==”来进行相等判断

                                                           图(4)

也即car1这个变量的值是地址1,car2这个变量的值是地址2。两个的值(堆空间的地址)是不相等,下图这样也就能明白了。

理一理java与C#中的equals方法和“==”来进行相等判断

                                                                           图(5)

2.我们知道,equals方法可以用来比较两个引用类型的内容是否相等,但这是对于重写了object类的equals方法而言的,

如String、Date以及Double、Integer等类而言的。

对于自定义类,如上面的Car,若直接使用equals方法来判断其内容是否相等就会得到false

理一理java与C#中的equals方法和“==”来进行相等判断

                                                                        图(6)

原因是object类equals方法内部执行的是“==”判断,源码如下图

理一理java与C#中的equals方法和“==”来进行相等判断

                                                       图(7)

图(7)来源于https://www.cnblogs.com/dolphin0520/p/3592500.html

因此,我们借助于String对Car的equals方法进行简单重写后判断

理一理java与C#中的equals方法和“==”来进行相等判断

                                                                                                       图(8)

这样就能判断两个引用类型的内容是否一样了。

二、C#中的equals和==

我们都知道,C#出现在java之后,里面的许多特性都和java一样,就如本专题,所有的类都继承自object基类,object类中都有equals方法,C#中的equals方法是虚方法即virtual修饰的,这就清楚地表明其子类在需要这个方法时重写一下,java和C#中的“==”运算符(你若不进行重操作)都是比较的值类型,这里不再作图描述。

需要说明的是,C#中的String方法既重写了“==”运算符,又重写了equals方法,两个都能对引用内容进行比较。

如下图:

理一理java与C#中的equals方法和“==”来进行相等判断

                                                                                     图(9)

原因在于String类在进行“==”比较时,其运算符内部调用的是equals方法,如下图:

理一理java与C#中的equals方法和“==”来进行相等判断

                                         图(10)

图(10)来源于https://www.cnblogs.com/chen0720/p/3209398.html

对java和C#的String类进行总结:

1)java中的String 类只对equals方法进行了重写,让其能够对引用变量的内容进行比较。

2)C#中的String类对equals方法和“==”运算符都进行了重写,equals方法重写了之后和java一样,“==”运算符重写调用了equals方法。

以上就是两种语言的equals和“==”运算符在做比较时的原理以及在用的最多的String中的使用。