![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxCeJRUTwcGVPJTRywEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3PnBnauMzM4AzMzQTMwETMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
題目内容
題目内容很簡單,就是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