首页 » 编写高质量代码:改善Java程序的151个建议 » 编写高质量代码:改善Java程序的151个建议全文在线阅读

《编写高质量代码:改善Java程序的151个建议》建议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等与此相同,也是只关心集合元素,不用考虑集合类型。

注意 判断集合是否相等时只须关注元素是否相等即可。