大多轉載自 百度知道,個人整理以便日后閱讀。
value1.compareTo(value2) == 0
value1.equals(value2)
equals的效率高些,compareTo其實就是按照編碼的數值求差值,根據差值進行比較,它能確定兩個String在字典順序上的前后性,當你只是想知道是否一致時,用equals也行,效果一樣。 另外,equals是Object的方法,要求涉及到比較操作的繼承類要自己重寫該方法,所以String重寫了equals,而compareTo為String的方法。所以: value1.compareTo(value2),當value1不為String類型時,會報錯。 而 value1.equals(value2),都會進行比較。
實現了Comparable接口的類才有compareTo方法,有了就可以用, 所有已知實現類: Authenticator.RequestorType, BigDecimal, BigInteger, Boolean, Byte, ByteBuffer, Calendar, Character, CharBuffer, Charset, ClientInfoStatus, CollationKey, Component.BaselineResizeBehavior, CompositeName, CompoundName, Date, Date, Desktop.Action,String .....很多~ 但是Object類 只有.equals(),沒compareTo Object是根類,它有的方法,其他類都可以繼承,使用.所以.equals 基本隨時能用.
/**
* 實現Comparable接口,重寫compareTo方法,返回值1,0,-1
* 覆寫compareTo方法就是重建排序規則
*/
public int compareTo(Object obj) {
Person p = (Person) obj;
if (p.score > this.score) {
return 1;
} else if (p.score < this.score) {
return -1;
} else {
// 如果成績相等則判斷年齡
if (p.age > this.age) {
return 1;
} else if (p.age < this.age) {
return -1;
} else {
return 0;
}
}
}
1. == : 基本數據類型都用這個比較, Java里面包含8個基本數據類型,分別是: boolean、byte、char、short、int、float、double、long 注意String 可不屬於基本數據類型,它是個類...
2..equals() 用於引用數據類型(除了上面的8個,都是引用數據類型,包括封裝類,Object子類等), 比較是否指向相同的對象, 例如 String str = "abc"; 等效於: char data[] = {'a', 'b', 'c'}; String str = new String(data); 就是str 指向了 new String(data) 這個對象. 如果再有其他變量也指向這個對象,他們比較的結果就返回true; 由於此方法在Object里, 所以它有很多重寫, 具體要看說明; 另外``` equalsIgnoreCase()可以忽略大小寫;
Object和String的equals()實現存在區別,所以上面的例子不太友好。有demo在最后
3. compareTO可以比較兩個字符串並且得到順序. 按字典順序比較兩個字符串。該比較基於字符串中各個字符的 Unicode 值。將此 String 對象表示的字符序列與參數字符串所表示的字符序列進行比較。
String類 equals和compareTo源碼分析:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
public int compareTo(String anotherString) {
int len1 = count;
int len2 = anotherString.count;
int n = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
if (i == j) {
int k = i;
int lim = n + i;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
} else {
while (n-- != 0) {
char c1 = v1[i++];
char c2 = v2[j++];
if (c1 != c2) {
return c1 - c2;
}
}
}
return len1 - len2;
}
object 的默認equals實現:
public boolean equals( Object o2 )
{
this == o2;
}
