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 =https://www.cnblogs.com/dustlike/p/= ((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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/436944.html
標籤:Java
