前言:相信网上类似的博客很多了,但两种语言的这个对比着来理解的很少,最近在做C#项目时产生了这个想法,今天写这篇博客是为了帮助自己不会忘记,也希望能帮助到看到这篇文章的你。谈到对比,那肯定这两种语言中的equals和==有点儿不一样,嘿嘿,怎么个不一样,我们下面来看看。
一、java中的equals和==
1.你若不对“==”运算符进行重操作,那进行的就是栈空间值类型的比较,如:
图(1)
图(2)
所以,也就是 2和3的比较,不相等返回false。
对应的,你若用“==”运算符来比较引用类型的变量会如何呢?
图(3)
答案是false,原因如下图:
图(4)
也即car1这个变量的值是地址1,car2这个变量的值是地址2。两个的值(堆空间的地址)是不相等,下图这样也就能明白了。
图(5)
2.我们知道,equals方法可以用来比较两个引用类型的内容是否相等,但这是对于重写了object类的equals方法而言的,
如String、Date以及Double、Integer等类而言的。
对于自定义类,如上面的Car,若直接使用equals方法来判断其内容是否相等就会得到false
图(6)
原因是object类equals方法内部执行的是“==”判断,源码如下图
图(7)
图(7)来源于https://www.cnblogs.com/dolphin0520/p/3592500.html
因此,我们借助于String对Car的equals方法进行简单重写后判断
图(8)
这样就能判断两个引用类型的内容是否一样了。
二、C#中的equals和==
我们都知道,C#出现在java之后,里面的许多特性都和java一样,就如本专题,所有的类都继承自object基类,object类中都有equals方法,C#中的equals方法是虚方法即virtual修饰的,这就清楚地表明其子类在需要这个方法时重写一下,java和C#中的“==”运算符(你若不进行重操作)都是比较的值类型,这里不再作图描述。
需要说明的是,C#中的String方法既重写了“==”运算符,又重写了equals方法,两个都能对引用内容进行比较。
如下图:
图(9)
原因在于String类在进行“==”比较时,其运算符内部调用的是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中的使用。