題目內容 題目內容很簡單,就是創建 ArrayList 和 Vector 集合,向兩者添加相同內容的字元串,最後用 equals() 方法比較是否相等。 這裡就考察了 "==" 和 equals() 方法的知識點。 這裡我最開始以為輸出為 false,但實驗了一下,結果為 true! 為什麼呢?因為 ...
題目內容
題目內容很簡單,就是創建 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<E> 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 (!(o1==null ? o2==null : 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<StringBuilder> arrayList = new ArrayList<StringBuilder>(); arrayList.add(sb); Vector<StringBuilder> vector = new Vector<StringBuilder>(); 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;
}