之前兽掰,我寫過一個(gè)怎樣重寫Object的equals方法,現(xiàn)在我們來看看String是怎樣重寫equals方法的。
代碼如下:
/** The value is used for character storage.*/
private final char value[];
public boolean equals(Object anObject) {
//首先判斷比較的字符串是不是本身
if(this == anObject) {
return true;
}
//判斷Object是否是String類型
if(anObject instanceof String) {
// true 進(jìn)行強(qiáng)制類型聲明
String anotherString = (String) anObject;
//獲取char類型數(shù)組的長度
int n = value.length;
//比較 anotherString轉(zhuǎn)換成字符數(shù)組的長度是否相等
if(n == anotherString.value.length) {
//分布定義兩個(gè)char[]
char v1[] = value;
char v2[] = anotherString.value;
/*
*循環(huán)遞減直到字符數(shù)組長度直到不為0
* 依次從下標(biāo)0開始比較兩個(gè)char[]
*/
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
這段代碼的執(zhí)行步驟主要有:
- 按照Object規(guī)范重寫equals方法
- 如果對象是String類型在進(jìn)行數(shù)組是否相等比較
大家仔細(xì)看,String比較兩個(gè)字符串相等實(shí)際上是將字符串拆分成單個(gè)字符數(shù)組在進(jìn)行比較的,在數(shù)組比較是否相等時(shí),源碼設(shè)計(jì)用了一個(gè)算法:
- 首先比較兩個(gè)數(shù)組是否相等,不相等則直接返回false
- 如果兩個(gè)數(shù)組相等,在用一個(gè)while循環(huán)從一次比較每個(gè)數(shù)組元素.(規(guī)避了用兩個(gè)for循環(huán)比較數(shù)組的性能)。
運(yùn)用這個(gè)算法怎樣比較兩個(gè)數(shù)組是否相等
package com.minglangx.array;
import org.junit.Assert;
import org.junit.Test;
public class ArraysEquals {
public static void main(String[] args) {
String[] str1 = {"a","b","c"};
String[] str2 = {"a","b","c"};
//比較這兩個(gè)數(shù)組是否元素是否相等 保證數(shù)組上每個(gè)位置上元素都是一樣的
boolean boo = equalStringArray(str1, str2);
System.out.println("str1[]和str2[]是否相等>>>>>" + boo);
}
@Test
public static boolean equalStringArray(String[] str1,String[] str2) {
//如果采用兩層for循環(huán)的話效率很慢
if(str1.length == str2.length) { //先判斷兩個(gè)數(shù)組長度是否相同
int n = str1.length;
int i = 0;
while(n-- != 0) {
if(str1[i] != str2[i]) { //依次比較2個(gè)數(shù)組
return false;
}
i++;
}
return true;
}
return false;//數(shù)組長度不相等 則證明根本不是相同的兩個(gè)數(shù)組
}
}