Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等于/等于和==运算符之间的差异?_C#_Java - Fatal编程技术网

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