equal和==的区别

问题描述

objectg=a;objecth=b;Console.WriteLine(g==h);执行结果是falseConsole.WriteLine(g.Equals(h));执行结果是trueobject是引用类型,==是比较引用类型是否是对同一个对象的引用,那g和h中存的是a和b在堆中的地址,执行结果是falseequal是比较的是两个对象的内容是否一致,那对象的内容是a和b,应该不一致,是false才对?Personp1=newPerson("jia");Personp2=newPerson("jia");Console.WriteLine(p1==p2);执行结果是falseConsole.WriteLine(p1.Equals(p2));执行结果是false==是比较引用类型是否是对同一个对象的引用,那执行结果应该是falseequal是比较的是两个对象的内容是否一致,那都是("jia"),那执行结果应该是true才对?

解决方案

解决方案二:
==对于引用类型(非字符串),永远是比较引用,没办法重写==equals可以重写。重写后可以实现自己的比较逻辑。
解决方案三:
如果姓名相同,就算同个人的话,可以这样:publicclassPerson{publicstringName{get;set;}#region重载EqualspublicoverrideboolEquals(objectobj){if(obj!=null&&objisPerson){returnName==((Person)obj).Name;}returnfalse;}publicoverrideintGetHashCode(){returnName.GetHashCode();}#endregion#region重载==publicstaticbooloperator==(Personp1,Personp2){if(((object)p1)!=null||((object)p2)!=null){if(!string.IsNullOrEmpty(p1.Name)&&!string.IsNullOrEmpty(p2.Name)){returnp1.Name==p2.Name;}}returnfalse;}publicstaticbooloperator!=(Personp1,Personp2){return!(p1==p2);}#endregion}

解决方案四:
引用类型重载后,Equal运算可以比对不同类型的的对象,比如用Person的实例和Employee的实例那怕它们之间没有继承关系,也可以按你想要的逻辑进行Equal的运算,而==不行。
解决方案五:
引用楼主u011724677的回复:

objectg=a;objecth=b;Console.WriteLine(g==h);执行结果是falseConsole.WriteLine(g.Equals(h));执行结果是true

如果你不贴出a和b的具体内涵,就不能随便说后者一定打印true。你测试一下inta=1;intb=2;objectg=a;objecth=b;Console.WriteLine(g==h);//执行结果是falseConsole.WriteLine(g.Equals(h));

解决方案六:
不知道你Person是怎么定义,如果没有重载Equals,则你的结果可能就有问题。采用以下测试代码及结果为:varp1=new{name="jia"};varp2=new{name="jia"};Console.WriteLine(p1==p2);//FalseConsole.WriteLine(p1.Equals(p2));//True
解决方案七:
你的代码实际上跟运算符重载没有关系,你使用了“弱类型”,那么你就丧失了类型系统的优点。这个时候,仅仅有Equals能帮上一点忙。例如usingSystem;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){vara=new马{齿龄=8};varb=new香蕉{成熟度=96};objectg=a;objecth=b;Console.WriteLine(g==h);//执行结果是falseConsole.WriteLine(g.Equals(h));Console.WriteLine("按任意键结束.....");Console.ReadKey();}}class马{publicint齿龄;publicoverrideboolEquals(objectobj){vara=objas香蕉;if(a!=null)returna.成熟度==this.齿龄*12;returnbase.Equals(obj);}}class香蕉{publicint成熟度;}}

在这个例子中,当通过“马”来调用Equals的时候,一匹马可以等于一只香蕉。但是假设是强类型的,那么就可以真正让==运算符重载。例如代码usingSystem;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){vara=new香蕉{成熟度=96};varb=new马{齿龄=8};Console.WriteLine(a==b);Console.WriteLine("按任意键结束.....");Console.ReadKey();}}class马{publicint齿龄;}class香蕉{publicint成熟度;publicstaticbooloperator==(香蕉x,马b){returnx.成熟度==b.齿龄*12;}publicstaticbooloperator!=(香蕉x,马b){return!(x==b);}}}

这里,强类型系统就能使得==运算符具有业务表现力了(而不是纠结什么对象的指针了)。在编程设计中,我们应该尽可能禁止声明object弱类型,应该把变量声明为强类型(包括接口)的。应该尽量删除弱类型代码。
解决方案八:
通常我们看到你的这种g和h的变量声明,会第一时间删除掉。因为就算是你不知道最终具体类型,你可以把g和h声明为“父类”或者“接口”,为什么滥用object呢?当你滥用object,你觉得随后的代码就“万能”了,而实际上这个时候就埋下定时炸弹了。比如说代码inta=1;stringb="2";//这里不小心把类型搞错了objectg=a;objecth=b;Console.WriteLine(g==h);//执行结果是falseConsole.WriteLine(g.Equals(h));

你要是在最后发现程序运行得一塌糊涂时,才去找为什么数据混乱、甚至崩溃,在这个只有5行代码的地方你也许觉得“方便”,但是在一个实际的项目中,那就是灾难,就是无数次在开发中无法发现、在用户面前才丢人现眼的教训,才能让你反思出来要从一开始就把变量g和h声明为强类型的!基本上都应该禁用弱类型。那种故意认为“越是object类型代码越万能”的做法,其实是成事不足的编程习惯。此外,我以前对于强类型也回复过一个帖子。其中在最后也有一个“句子”的例子,代码是这样的:句子clause=(主语)s1+(谓语)s2+(宾语)s3;

说明强类型声明,可以用来“成文自明”地表达更好的程序。
解决方案九:
==和Equals都可以重写,所以区别要看具体的实现
解决方案十:
看过许多的文章描述==与Equals的区别,基本都没怎么去深究过只是尽量保持在“普通”变量类型进行==的判断,尽量小心在对象与引用之间的判断
解决方案十一:
http://www.jb51.net/article/37212.htm不深究这种问题。
解决方案十二:
正常的,一个是地址相同,一个是值相同
解决方案十三:
引用7楼sp1234的回复:

通常我们看到你的这种g和h的变量声明,会第一时间删除掉。因为就算是你不知道最终具体类型,你可以把g和h声明为“父类”或者“接口”,为什么滥用object呢?当你滥用object,你觉得随后的代码就“万能”了,而实际上这个时候就埋下定时炸弹了。比如说代码inta=1;stringb="2";//这里不小心把类型搞错了objectg=a;objecth=b;Console.WriteLine(g==h);//执行结果是falseConsole.WriteLine(g.Equals(h));

你要是在最后发现程序运行得一塌糊涂时,才去找为什么数据混乱、甚至崩溃,在这个只有5行代码的地方你也许觉得“方便”,但是在一个实际的项目中,那就是灾难,就是无数次在开发中无法发现、在用户面前才丢人现眼的教训,才能让你反思出来要从一开始就把变量g和h声明为强类型的!基本上都应该禁用弱类型。那种故意认为“越是object类型代码越万能”的做法,其实是成事不足的编程习惯。此外,我以前对于强类型也回复过一个帖子。其中在最后也有一个“句子”的例子,代码是这样的:句子clause=(主语)s1+(谓语)s2+(宾语)s3;

说明强类型声明,可以用来“成文自明”地表达更好的程序。

另外求解的类名太长的或者是NEW,喜欢用var,这算不算坏习惯?求解答
解决方案十四:
你要说a和b是什么,我才能告诉你g.Equals(h)为什么是true至于你的标题,对于引用类型,引用类型知道吧?equal表示值相等,==表示引用相等比如objecta=newcar("abc");objectb=newcar("abc");他们的值是相等的,用equal就是true,但是他们的引用不一样(有两个car),==为false
解决方案十五:
自己看源码啊
解决方案:
ReferenceEquals专门比较地址Equals和==,对于值类型,比较内容;对于引用类型,比较地址-------------------------objectg=a;objecth=b;Console.WriteLine(g==h);执行结果是falseConsole.WriteLine(g.Equals(h));执行结果是true按照你的输出结果,那么a,b两个对象中存储着相同的内容,但对应着2个地址,如objecta=newmyClass("abc");objectb=newmyClass("abc");这样,两个new就是2个地址,分别赋值给g,h,那么g,h也就是地址不同,内容相同--------------------------------Personp1=newPerson("jia");Personp2=newPerson("jia");Console.WriteLine(p1==p2);执行结果是false2个new出来的,地址一定不同Console.WriteLine(p1.Equals(p2));执行结果是false。按理论,应该是true!

时间: 2024-09-20 16:31:19

equal和==的区别的相关文章

2016年Java面试题整理

面试是我们每个人都要经历的事情,大部分人且不止一次,这里给大家总结最新的2016年面试题,让大家在2017年找工作时候能够事半功倍. 1 Switch能否用string做参数? a.在 Java 7 之前, switch 只能支持byte,short,char,int 或者其对应的封装类以及 Enum 类型.在JAVA 7中,String 支持被加上了. 2 equals与==的区别: a.==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不

各大公司Java后端开发面试题总结

ThreadLocal(线程变量副本) Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量. 采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突. ThreadLocal类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值为对应线程的变量副本. ThreadLocal在Spring中发挥着巨大的作用,在管理Request作用域中的Bean.事

java中 == 与 equal 的区别讲解_java

废话不多说了,开门见山吧,先来看一段代码: 复制代码 代码如下: String str1 = new String("str");        String str2 = new String("str");        System.out.println("==比较 :"+ str1 == str2);        System.out.println("equal比较:"+ str1.equals(str2)); 

a.equal(b)和b.equal(a)有什么区别么

问题描述 a.equal(b)和b.equal(a)有什么区别么 解决方案 解决方案二:前一个a不能为null,后一个b不能为null.除此之外,是相同的.解决方案三:参考楼上的.解决方案四:楼上很正确如果两个值都是非空的那么结果是一样的差别在语法上:前者不能为空,因为如果前者为空,就变成了null.equal(..).前者就不存在equal这个方法.所以就报错了.解决方案五:如果你重写对象的equals方法,也是会有区别的.

探究equal()和“==”的区别时遇到下面问题

问题描述 packageindexOperating;publicclassBijiao{publicstaticvoidmain(String[]args){Strings1,s2,s3="abc",s4="abc";s1=newString("abc");s2=newString("abc");System.out.println(s1.equals(s2));System.out.println(s1==s2);Syst

java中”==”和”Equal”的区别

对于一些基本数据类型,int,long,bool,还有char!,"=="都是表示值相等的意思,没有equal方法. equal方法是object对象里面的方法,java中String不是基本数据类型,而是一个类,它们都是继承object类,还有Integer和int的区别也是Integer是一个类! 在object类中,equal方法与"=="是等同的,"=="不是表示值相等,而是比较对象的地址是否相等!Integer和String都重写了(没

Scalaz(4)- typeclass:标准类型-Equal,Order,Show,Enum

  Scalaz是由一堆的typeclass组成.每一个typeclass具备自己特殊的功能.用户可以通过随意多态(ad-hoc polymorphism)把这些功能施用在自己定义的类型上.scala这个编程语言借鉴了纯函数编程语言Haskell的许多概念.typeclass这个名字就是从Haskell里引用过来的.只不过在Haskell里用的名称是type class两个分开的字.因为scala是个OOP和FP多范畴语言,为了避免与OOP里的type和class发生混扰,所以就用了typecl

HashSet和TreeSet的区别

HashSet和TreeSet的区别 一. 问题 1. HashSet,TreeSet是如何使用hashCode()和equals()方法的? 2. TreeMap,TreeSet中的对象为何要实现Comparable接口? 二. 回答: 1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key 2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个有序性. 3.hashCode和equal(

equals(Object) 与 == 的区别

在比较对象时候,常常用到"=="和"equals(Object)".它们常常让初学者感到疑惑.下面先看一个例子 public class Example1{ public static void main(String[] args) { String s1=new String("abc"); String s2=new String("abc"); // s1=s2; System.out.println("用