zoukankan      html  css  js  c++  java
  • [改善Java代码]列表相等只需关系元素数据

    来看一个判断列表相等的例子,看代码:

     1 import java.util.ArrayList;
     2 import java.util.Vector;
     3 
     4 public class Client {
     5     public static void main(String[] args) {
     6         ArrayList<String> strs = new ArrayList<String>();
     7         strs.add("A");
     8         
     9         Vector<String> strs2 = new Vector<String>();
    10         strs2.add("A");
    11         System.out.println(strs.equals(strs2));
    12     }
    13 }

    运行输出:true

    两个类都不相同,一个是ArrayList,一个是Vectory,那结果为什么还是true?

    两者都是列表List,都实现了List接口,也都继承了AbastractList抽象类,其中equals方法是在AbstractList中定义的,我们看源代码:

     1     public boolean equals(Object o) {
     2         if (o == this)
     3             return true;
     4         //是否是List列表,注意这里:只要实现list接口即可
     5         if (!(o instanceof List))
     6             return false;
     7         //通过迭代器访问list的所有元素.
     8         ListIterator<E> e1 = listIterator();
     9         ListIterator e2 = ((List) o).listIterator();
    10         //遍历两个list元素
    11         while (e1.hasNext() && e2.hasNext()) {
    12             E o1 = e1.next();
    13             Object o2 = e2.next();
    14             //只要存在着不相等的就退出
    15             if (!(o1==null ? o2==null : o1.equals(o2)))
    16                 return false;
    17         }
    18         //长度是否也相等
    19         return !(e1.hasNext() || e2.hasNext());
    20     }

    看到没,这里只是要求实现了List接口就成,它不关心List的具体实现类,只要所有的元素相等,并且长度也相等就表明两个List是相等的,与具体的容量类型无关.

    也就是说,上面的例子中虽然一个是ArrayList一个是Vector,只要里面的元素相等,那结果就是相等.

    Java如此处理也确实是在为开发者考虑,列表只是一个容器,只要是同一种类型的容器(如List),就不用关心容器的细节差别(如ArrayList和LinkedList),只要确定所有的元素数据相等,那这两个列表就是相等的.

    如此一来,我们再开发中就不同太关注容器的细节了.可以把注意力更多的放在数据元素上,而且即使在中途重构容器类型,也不会对相等的判断产生太大的影响.

    其他的集合类型,如Set,Map等与此相同,也是只关心集合元素,不用考虑集合类型.

    判断集合相等时只需关注元素是否相等即可.

  • 相关阅读:
    ActiveMQ的用途
    HTTP 状态码的完整列表
    Linux中脚本运行错误(坏的解释器:没有那个文件或目录)
    Linux下ping: unknown host www.baidu.com的解决办法
    python中的collection
    Table里嵌套ASPXGridView
    致2015
    WPF学习之Binding(二)
    WPF学习之Binding(一)
    WPF UI布局(Layout)
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5659914.html
Copyright © 2011-2022 走看看