讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議69:列表相等只需關心元素數據 >

建議69:列表相等只需關心元素數據

我們來看一個判斷列表相等的例子,代碼如下:


public static void main(Stringargs){

ArrayList<String>strs=new ArrayList<String>();

strs.add("A");

Vector<String>strs2=new Vector<String>();

strs2.add("A");

System.out.println(strs.equals(strs2));

}


兩個類都不相同,一個是ArrayList,一個是Vectory,那結果肯定不相等了!真是這樣嗎?其實結果是兩者相等!

我們來詳細分析一下為什麼兩者是相等的。兩者都是列表(List),都實現了List接口,也都繼承了AbastractList抽像類,其equals方法是在AbstractList中定義的,我們來看源代碼:


public boolean equals(Object o){

if(o==this)

return true;

//是否是List列表,注意這裡:只要實現list接口即可

if(!(o instanceof List))

return false;

//通過迭代器訪問list的所有元素

ListIterator<E>e1=listIterator();

ListIterator e2=((List)o).listIterator();

//遍歷兩個list的元素

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

E o1=e1.next();

Object o2=e2.next();

//只要存在著不相等就退出

if(!(o1==null?o2==null:o1.equals(o2)))

return false;

}

//長度是否也相等

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

}


看到沒?這裡只是要求實現了List接口就成,它不關心List的具體實現類。只要所有的元素相等,並且長度也相等就表明兩個List是相等的,與具體的容量類型無關。也就是說,上面的例子中雖然一個是ArrayList,一個是Vector,只要裡面的元素相等,那結果就是相等。

Java如此處理也確實是在為開發者考慮,列表只是一個容器,只要是同一種類型的容器(如List),不用關心容器的細節差別(如ArrayList與LinkedList),只要確定所有的元素數據相等,那這兩個列表就是相等的。如此一來,我們在開發中就不用太關注容器細節了,可以把注意力更多地放在數據元素上,而且即使在中途重構容器類型,也不會對相等的判斷產生太大的影響。

其他的集合類型,如Set、Map等與此相同,也是只關心集合元素,不用考慮集合類型。

注意 判斷集合是否相等時只須關注元素是否相等即可。