C# 等于/等于和==运算符之间的差异?
C# 等于/等于和==运算符之间的差异?,c#,java,C#,Java,a==b和a.Equals(b)之间有什么区别?操作符检查两个对象是否完全相同,这在大多数情况下是不可能的。Equals方法将能够在内部比较两个对象 例如: class Mycar { string color; Mycar(string str) { color = str; } } Mycar a = new Mycar("blue"); Mycar b = new Mycar("blue"); a==b // Returns false a.Equals(b) /
a==b
和a.Equals(b)
之间有什么区别?操作符检查两个对象是否完全相同,这在大多数情况下是不可能的。Equals方法将能够在内部比较两个对象
例如:
class Mycar
{
string color;
Mycar(string str)
{
color = str;
}
}
Mycar a = new Mycar("blue");
Mycar b = new Mycar("blue");
a==b // Returns false
a.Equals(b) // Returns true
它取决于
a
和b
的类型
特别是,Equals
是一个虚拟方法,因此它的行为不依赖于a和b的编译时类型
在Java中,==
总是通过引用进行比较,这不一定是您想要的,尤其是对于字符串
在C#中,==
可以重载,但不是虚拟的(这是一种静态方法)。因此,如果a
或b
被声明为对象
,它将通过引用进行比较,即使它们的实际类型重载运算符==
另外,a.Equals(b)
将抛出NullReferenceException
(Java中的NullPointerException
)如果a是null,假设a
和b
的类型是引用类型:
- 在Java中,==将始终比较标识,即两个值是否是对同一对象的引用。这也称为引用相等。Java没有任何用户定义的运算符重载
- 在C#中,视情况而定。除非有一个重载运算符来处理它,==的行为将类似于Java(即比较引用相等)。但是,如果有一个重载与
a
和b
的编译时类型相匹配(例如,如果它们都声明为字符串),则将调用该重载。这可以按照它想要的方式运行,但它通常实现值相等(即a
和b
可以引用不同但相等的值,并且仍然返回true)
在这两种语言中,a.Equals(b)
或a.Equals(b)
将调用由Object
声明的虚拟Equals
方法,除非编译时类型a
引入了更具体的重载。在a
引用的对象的执行时间类型中,这可能会被覆盖,也可能不会被覆盖。在.NET和Java中,Object
中的实现也会检查标识。请注意,这取决于执行时间类型,而不是重载解析所依赖的编译时间类型
当然,如果a
为null
,那么当您尝试调用a.equals(b)
或a.equals(b)a==b
时,您将得到NullReferenceException
如果引用包含相同的值,即它们指向相同的对象,则返回true,或者它们都是空的
可以重写equals()
方法来比较对象。例如,在Strings
上,如果字符串包含相同的字符串,即使它们是不同的字符串对象,该方法也会返回true
。您可以对自己的对象执行类似的操作
o.equals()
将在o为空引用时引发异常
String a = "toto".Substring(0, 4);
String b = "toto";
Object aAsObj = a;
Assert.IsTrue(a.Equals(b));
Assert.IsTrue(a == b);
Assert.IsFalse(aAsObj == b);
Assert.IsTrue(aAsObj.Equals(b));
这个测试通过了.NET,诀窍是Equals
是一个方法,而=
是一个静态方法,所以aAsObj==b
使用
static bool Object.operator==(object a, object b) //Reference comparison
static bool String.operator==(string a, string b) //String comparison
而a==b
使用
static bool Object.operator==(object a, object b) //Reference comparison
static bool String.operator==(string a, string b) //String comparison
但是a.Equals(b)
或aAsObj.Equals(b)
始终使用:
bool String.Equals(Object obj) //String comparison
=
使用对象的引用,或者如果是整数/浮点等,则比较实际数字。从技术上讲,它只是比较内存位置中的内容。
虽然.equals
使用对象类内部的方法来比较对象,但是可以为您的单个类重写该方法。
另外,由于数组也处理引用,因此不使用array1[i]=array2[i]
、使用arraycopy
或clone()
也很有帮助。
我认为.equals
也可以与数组一起使用=
检查对象引用,基本上它比较哈希代码。等于使用对象中的内容。记住,我们必须在类中相应地重写.equals
方法 ==,它只根据地址返回哈希代码的值,因此不同的地址即使字符串或任何类似的数据也会返回false…这是条件的完整帮助,返回布尔值 假设我们有a
和b
或两个不同的对象,我们想比较这两个对象引用。然后我们使用=
运算符,当使用a.equals(b)
时,它比较字符串值。==是该语言中的基本运算符。运算符==测试两个对象引用变量是否引用对象的完全相同实例
equals()是一个实例方法,基本上由java.lang.Object类定义。方法,.equals()测试要比较的两个对象是否相等,但它们不必是同一对象的完全相同实例
==运算符总是给您相同的结果,但是equals()方法根据您的实现(实现的逻辑)给您提供输出
1。自反:对于任何非空引用x,x.equals(x)应返回true。
public class StringEqualityTest {
public static void main(String []a){
String s1=new String("abc");
String s2=new String("abc");
System.out.print("s1.equals(s2) :"+s1.equals(s2)+" s1==s2 :");
System.out.println(s1==s2);
String s3="abc";
String s4="abc";
System.out.print("s3.equals(s4) :"+s1.equals(s2)+" s3==s4 :");
System.out.println(s3==s4);
}
}
2。对称:对于任何非空引用x和y,如果x.equals(y)为真,则y.equals(x)必须返回真。
public class StringEqualityTest {
public static void main(String []a){
String s1=new String("abc");
String s2=new String("abc");
System.out.print("s1.equals(s2) :"+s1.equals(s2)+" s1==s2 :");
System.out.println(s1==s2);
String s3="abc";
String s4="abc";
System.out.print("s3.equals(s4) :"+s1.equals(s2)+" s3==s4 :");
System.out.println(s3==s4);
}
}
3。可传递:对于任何非空引用x、y和z,如果x.equals(y)为真,y.equals(z)为真,则x.equals(z)必须返回真。
public class StringEqualityTest {
public static void main(String []a){
String s1=new String("abc");
String s2=new String("abc");
System.out.print("s1.equals(s2) :"+s1.equals(s2)+" s1==s2 :");
System.out.println(s1==s2);
String s3="abc";
String s4="abc";
System.out.print("s3.equals(s4) :"+s1.equals(s2)+" s3==s4 :");
System.out.println(s3==s4);
}
}
4。一致:对于任何非空引用x和y,多个invoc