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

 import java.util.ArrayList;
import java.util.Vector; public class Client {
public static void main(String[] args) {
ArrayList<String> strs = new ArrayList<String>();
strs.add("A"); Vector<String> strs2 = new Vector<String>();
strs2.add("A");
System.out.println(strs.equals(strs2));
}
}

运行输出:true

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

两者都是列表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等与此相同,也是只关心集合元素,不用考虑集合类型.

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

[改善Java代码]列表相等只需关系元素数据的更多相关文章

  1. [改善Java代码]线程优先级只使用三个等级

    线程的优先级(priority)决定了线程获得CPU运行的机会,优先级越高获得的运行机会越大,优先级越低获得的机会越小.Java的线程有10个级别(准确的说是11个级别,级别为0的线程是JVM,应用程 ...

  2. 【代码更新】单细胞分析实录(21): 非负矩阵分解(NMF)的R代码实现,只需两步,啥图都有

    1. 起因 之前的代码(单细胞分析实录(17): 非负矩阵分解(NMF)代码演示)没有涉及到python语法,只有4个python命令行,就跟Linux下面的ls grep一样的.然鹅,有几个小伙伴不 ...

  3. java开发区块链只需150行代码

    本文目的是通过java实战开发教程理解区块链是什么.将通过实战入门学习,用Java自学开发一个很基本的区块链,并在此基础上能扩展如web框架应用等.这个基本的java区块链也实现简单的工作量证明系统. ...

  4. [改善Java代码]不推荐使用binarySearch对列表进行检索

    对一个列表进行检索时,我们使用的最多的是indexOf方法,它简单好用,而且也不会出错,虽然它只能检索到第一个符合条件的值,但是我们可以生成子列表后再检索.这样也就可以查找到所有符合条件的值了. Co ...

  5. [改善Java代码]避开基本类型数组转换列表陷阱

    开发中经常用到Arrays和Collections这两个工具类. 在数组和列表之间进行切换.非常方便.但是也会遇到一些问题. 看代码: import java.util.Arrays; import ...

  6. [改善Java代码]非稳定排序推荐使用List

    我们知道Set与List的最大区别就是Set中的元素不可以重复(这个重复指的equals方法的返回值相等),其他方面则没有太大的区别了,在Set的实现类中有一个比较常用的类需要了解一下:TreeSet ...

  7. [改善Java代码]易变业务使用脚本语言编写

    建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...

  8. jsp中Java代码中怎么获取jsp页面元素

    举例,页面元素<td><input   value="${sl }" type="text" id="sl" name=& ...

  9. [改善Java代码]不同的列表选择不同的遍历方法

    一.场景: 我们来看一个场景,统计一个省的各科高考科目考试的平均分. 当然使用数据库中的一个SQL语句就能求出平均值,不过这个不再我们的考虑之列,这里只考虑使用纯Java的方式来解决.(由于我的机器配 ...

随机推荐

  1. B+树|MYSQL索引使用原则

    MySQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了.为什么要改成这样,之前都没有听过 ...

  2. bashrc的加载

    无意中将home下的所有文件都删除了,一些配置文件都丢了. 重新登陆后,发现无法加载bashrc. 查找后,发现问题不在于bashrc,而在与.bash_profile丢失 login shell m ...

  3. [C语言 - 8] 枚举enum

    枚举是c语言中得一种基本数据类型,不是数据结构 用于声明一组常数 1. 3中枚举变量的方式 a. 先定义类型, 再定义变量 b. 同时定义类型和变量 c. 匿名定义 enum Season {Spri ...

  4. HDU 1796How many integers can you find(简单容斥定理)

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  5. Java学习笔记(六):面向对象、接口和抽象类

    类和对象 Java是一门面向对象的语言,下面我们来了解一下Java中的面向对象. 方法和重载 Java中的方法格式如下: 访问修饰符 返回值类型 方法名(参数){ 方法主体 } Java的方法支持重载 ...

  6. matlab eps中文乱码的解决方法

    直接存成eps总是乱码 最优解决方法是matlab print 保存成jpg,之后用adobe  acrobat pro 打开jpg文件另存为eps

  7. linux之unlink函数解析

    [lingyun@localhost unlink]$ cat unlink.c  /********************************************************* ...

  8. apacheserver下载、安装、配置

     1.下载 下载地址:apache下载地址 点击左側"Download"下的链接,打开例如以下页面 这里能够选择版本号.我选择2.4.16.单击"2.4.16" ...

  9. MVC风格

    MVC风格 点击了解很多其它软件体系结构风格 §模型-视图-控制器风格常被简称为MVC风格 §组件:模型.视图.控制器 §连接件:显式调用.隐式调用.其它机制(比如:Http协议) 工作机制: Mod ...

  10. Apache Httpd通过mod_jk连接多个Tomcat

    一个tomcat能够配置多个web apps,这是众所周知的.当更改了一个web app,想要又一次启动的时候.因为全部的web apps都是放在同一个tomcat下的,所以别的web apps也在重 ...