Java、C#中'=='和'equals'的区别
Java、C#中'=='和'equals'的区别
前段时间水群跟群友讨论到'=='和'equals'的区别,抽空整理记录下。
Java
先说'=='
下面是测试代码
System.out.println(1==1);
System.out.println(new Integer(1)==new Integer(1));
得到的结果是
true
false
结论:对于基础类型(int、boolean、char)这类,'=='就是比较他们的值。而对于对象,它比较的是这个对象指向的地址,简单来讲就是等号两边是不是同一个对象,是返回true,否则返回false。测试用例中new出了两个Integer对象,虽然值相同,但是显然这两不是同一个对象。
然后是'equals'
先看Object类的'equals'方法
public boolean equals(Object obj) {
return (this == obj);
}
可以看到,Object类的'equals'方法只是对'=='做了简单的封装。
所以Java里的类,如果没有重写过'equals'方法,那么'=='和'equals'方法是没有本质区别的。
下面是一些常用的重写了'equals'方法的类
String类源码
public boolean equals(Object anObject) {
if (this == anObject) { //先用==判断这两是不是同一个对象
return true;
}
if (anObject instanceof String) { //判断传入对象是否是String类的实例
String anotherString = (String)anObject;//强制转换为String类型
int n = value.length;
if (n == anotherString.value.length) {//判断当前对象和传入对象的长度是否一致
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {//逐个比较两个字符串里的字符
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Integer类源码
public boolean equals(Object obj) {
if (obj instanceof Integer) {//判断传入对象是否是Integer类的实例
return value == ((Integer)obj).intValue();//比较两者的值
}
return false;
}
HashMap类
public final boolean equals(Object o) {
if (o == this)//先用==判断这两是不是同一个对象
return true;
if (o instanceof Map.Entry) {//判断传入对象是否是Map的实例
Map.Entry<?,?> e = (Map.Entry<?,?>)o;
if (Objects.equals(key, e.getKey()) &&
Objects.equals(value, e.getValue()))//分别比较两者的key和value是否一致,用的Objects的equals
return true;
}
return false;
}
String的特殊情况
String a="123";
String b="123";
System.out.println(a==b);
输出结果是true
这是因为a和b指向的都是“123”这个字符串,内存里没有生成一个新的“123”字符串。
在代码里写死的这些字符串,在程序运行的时候会自动在内存里创建一片空间,在拿它给其他String对象赋值的时候,只是简单地将对象的指针指向这个空间。
上面代码等同于
String s = new String("123");
String a=s;
String b=s;
System.out.println(a==b);
很显然,a和b其实都是s,所以输出true。
C#
C#中'equals'情况与Java相似,但是'=='略有区别。
在C#中,String类是特殊的,'=='与Java中String类的'equals'方法相似,也是先比较两者的地址是否一致,不一致再比较两者的值是否一致。
都是一些学习或者刷题时遇到的问题,如有错误,欢迎指正,来自博客园,作者:若尘丶5251,转载请注明原文链接:https://www.cnblogs.com/dustlike/p/15958993.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义