天天看點

Java集合類AbstractList一招巧妙實作equals()重寫

Java集合類AbstractList一招巧妙實作equals()重寫

題目内容

Java集合類AbstractList一招巧妙實作equals()重寫

題目内容很簡單,就是Java中建立 ArrayList 和 Vector 集合,向兩者添加相同内容的字元串,最後用 equals() 方法比較是否相等。

這裡就考察了 “==” 和 equals() 方法的知識點。

這裡我最開始以為輸出為 false,但實驗了一下,結果為 true!

為什麼呢?因為我不知道 ArrayList 和 Vector 的共同父類 AbstractList 重寫了 Object 類的 equals() 方法。

重寫方法體如下:

public boolean equals(Object o) {

   // 這裡利用 == 判斷兩個集合是否為同一引用同一位址,因為是 == 比較的

if (o == this)

return true;

// 這裡判斷比較集合是否為 List 的執行個體,如果不是直接傳回 false

if (!(o instanceof List))

return false; // 建立疊代器

ListIterator e1 = listIterator();

ListIterator<?> e2 = ((List<?>) o).listIterator();

// 在兩者都有元素的情況下,比較兩者元素是否相等

while (e1.hasNext() && e2.hasNext()) {

E o1 = e1.next();

Object o2 = e2.next();

// 這裡的比較規則如下:

     //   1. 兩者元素其中一個為 null, 但另一個不為 null, 則傳回 false

//   2. 其中一個元素不為 null, 但兩者使用 equals() 方法比較為 false, 則傳回 false

if (!(o1null ? o2null : o1.equals(o2)))

return false;

}

   // 集合元素變量完之後,且循環體沒有傳回 flase, 則 如果任意一個集合還有元素則傳回 false

return !(e1.hasNext() || e2.hasNext());

}

由于題目中集合的泛型為 String,而 String 也重寫了 equals() 方法,是以,題目中的集合内容也是相同的,即比較結果為 true。

如果元素内容為其他的,且沒有重寫 equals() 方法,那麼比較結果就為 false。

如:

public void test() {

StringBuilder sb = new StringBuilder(“demo”);

StringBuilder sb1 = new StringBuilder(“demo”); ArrayList arrayList = new ArrayList();

arrayList.add(sb); Vector vector = new Vector();

vector.add(sb1);

System.out.println(arrayList.equals(vector));

}

補充:

  很多人并不知道 Integer 類也重寫了 equals() 方法

public boolean equals(Object obj) {

if (obj instanceof Integer) {

//這裡很明顯,看似使用 == 比較,但是調用了 intValue() 方法傳回 int 類型,是以就是使用 == 比較基本資料類型,比較的也就是值是否相等了

return value == ((Integer)obj).intValue();

}

return false;

}public int intValue() {

  return value;

}

文章來自:https://www.itjmd.com/news/show-5341.html