前言

List 有多个实现,本文以ArrayList(LinkedList也一样)作为说明,equals是Object的一个成员函数,例子中的bean重写实现它。

一、Bean 类定义并重写equals函数

public class Book {private String id;private String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic boolean equals(Object obj) {//这里重写if (obj instanceof Book) {//obj是book对象,使用当前对象id与obj的id进行对比return id == null ? false : id.equals(((Book) obj).id);} else if (obj instanceof String) {//目的可以接受id进来匹配是不是同一本书(我们得到id,不需要构造一个book对象来进行匹配对比)return obj.equals(id);}return false;}
}

二、equals的演练

  1. Bean 对象 vs Bean对象
public static void main(String[] args) {Book book1 = new Book();book1.setId("111");book1.setName("语文");Book book2 = new Book();book2.setId("222");book2.setName("数学");println("book1 equals book2 ? " + book1.equals(book2));
}

book1 equals book2 ? false

book2作为参数,book1对象调用equals函数,id不一样,结果自然是false。

  1. Bean对象 vs String 对象
public static void main(String[] args) {String id = "111";Book book1 = new Book();book1.setId(id);book1.setName("语文");println("book1 equals String ? " + book1.equals("111"));
}

book1 equals String ? true

字符串"111"作为参数,book1对象调用equals函数,结果是true。这也符合我们重写equals的目的。

List演练

我们知道,list中包含某个对象,是通过遍历list的每一个元素和给定的对象相匹配,如果匹配上说明包含,反之不包含,且匹配也是调用equals函数。
看如下代码:

 public static void main(String[] args) {String id = "111";Book book1 = new Book();book1.setId(id);book1.setName("语文");Book book2 = new Book();book2.setId("222");book2.setName("数学");ArrayList list = new ArrayList(2);list.add(book1);list.add(book2);println("list contains book1 ? " + list.contains(book1));println("list contains id 111 ? " + list.contains("111"));
}

执行结果:

list contains book1 ? true
list contains id 111 ? false

结果不是我们期望的,前面已经验证 book1.equals(“111”)的结果是true,list.contains(“111”)的结果是false。
不急,来看看ArrayList的contains实现(contains实际上是调用了indexOf函数):

 public boolean contains(Object o) {return indexOf(o) >= 0;}/*** Returns the index of the first occurrence of the specified element* in this list, or -1 if this list does not contain the element.* More formally, returns the lowest index <tt>i</tt> such that* <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,* or -1 if there is no such index.*/public int indexOf(Object o) {if (o == null) {for (int i = 0; i < size; i++)if (elementData[i]==null)return i;} else {for (int i = 0; i < size; i++)//因为这个判断用的是o.equals,所以不包含111if (o.equals(elementData[i]))return i;}return -1;}

for (int i = 0; i < size; i++)确实是遍历了所有元素。问题在于if (o.equals(elementData[i]))
这里调用的是参数对象的equals,不是调用元素对象的equals函数。如果反过来if (elementData[i].equals(o))那么我们上面的结果就是true。

通俗的讲,list.contains(“111”),contains函数中匹配时,是"111".equals(elementData[i]),不再是book.equals(“111”)。

总体来说,我们有重新实现equals的情况下,在使用list的时候要避免使用非本类的对象匹配方式,一定要同类如:list.contains(book1)。上面的情况请用111 构造出一个Book对象才能得到正确的结果。当然,list的indexOf也是如此。

那么代码上为什么有这样的坑呢,应该为了代码简练,如果写成elementData[i].equals(o)的话,elementData[i]需要进行判空。
有知道更多原因的请留言,抱拳谢过。

AndroidJava List与equals的微妙关系,小心掉坑里相关推荐

  1. c++处处有杀机,不小心就要掉坑里

    元<元<类>类 G,类...T,整...I,类...O> 空 启动(整 n,序列<I...>,O&...o){(((n==I)&&(G< ...

  2. nginx 跨域。。。掉坑里了,小心

    今天公司产品一个功能突然挂掉了...向客户演示之前出现了,手机端显示不能获取下载资源,可是急坏了一票人.. 通过手机端,调查服务器地址调用了http:/2342342.domain.hostname. ...

  3. 初次接触高德地图生成key,小心掉坑

    初次使用项目中使用到了高德地图,由于不太清除key是怎么生成的,当时初次申请值时,没有太过于细节,随意填写了PackageName的信息,导致打包好后始终无法定位,经反复查找,和对比,最终发现问题所在 ...

  4. flex swf和movieclip之前的微妙关系

    flex swf和movieclip之前的微妙关系 开始不清楚, 一直尝试想load图片一样加载一个swftools转换的swf,然后在尝试转换成movieclip的时候,总是报错, avmiMovi ...

  5. 【面试题】hashCode() 和 equals() 之间的关系

    前言 关于 hashCode 和 equals 的处理,遵循如下规则: 只要重写 equals,就必须重写 hashCode 因为 Set 存储的是不重复的对象,依据 hashCode 和 equal ...

  6. 深入理解equals和hashCode关系和区别

    深入理解equals和hashCode关系和区别 直入主题: 区别: 1.他们判断对象相同的方式不一样: 2.他们判断对象是否相等的准确率不一样: 改写equals时总是要改写hashcode 分享一 ...

  7. hashcode的作用_【09期】说说hashCode() 和 equals() 之间的关系?

    上一篇关于介绍Object类下的几种方法时面试题时,提到equals()和hashCode()方法可能引出关于"hashCode() 和 equals() 之间的关系?"的面试题, ...

  8. 数学与计算机的微妙关系

    数学与计算机的微妙关系 一.高等数学 1.为什么要学习高等数学 2.高等数学的分类 3.高等数学的应用 1)生活上 2)科技上 4.高等数学发展阶段 1) 解析几何学建立 2) 微积分的创立 3) 集 ...

  9. 上云有风险 公有云选型小心进坑

    本文讲的是上云有风险 公有云选型小心进坑[IT168 云计算]市场商业的运作规则就是大鱼吃小鱼小鱼吃虾米,适者生存.在公有云领域,如果你没有实力长时间支撑一个企业运营微利甚至不盈利,那么云平台倒下一定 ...

最新文章

  1. 面试宝典:深入理解这110道python面试题,AI和大数据向你招手
  2. vue中 this.$set的用法
  3. 2016 年Adobe设计成就奖作品征集
  4. hdu 2196(树的最长链)
  5. VHDL简易电子琴的设计
  6. [Java基础]Set集合概述和特点
  7. php+go+to,让phpstrom支持codeigniter框架实现 (GO TO )转到定义的功能
  8. 如何调节电脑显示屏来保护双眼的小技巧
  9. Ubuntu校园iNode客户端超简单安装
  10. SMOTE算法(人工合成数据)
  11. envi精度评定_envi分类精度评价操作步骤
  12. 科技新品 | 富士胶片研发出全球最大容量数据流磁带;iGame发布内存新品“古德白”...
  13. 1.19.5.3.时态表、关联一张版本表、关联一张普通表、时态表、声明版本表、声明版本视图、声明普通表、时态表函数等
  14. MinIO集群怎么接入Prometheus监控?(上)
  15. UNIX_C 高级编程七
  16. php rtmp服务器搭建,rtmp直播服务器的搭建(小白踩坑)
  17. Word2Vec笔记
  18. Anaconda + tensorflow + win10 安装
  19. 计算机右下角图标显示桌面快捷方式,Win7系统下让常用软件图标显示在电脑右下角的方法【图】...
  20. 微信小程序分析送积分功能如何实现_微信小程序积分商城系统如何裂变营销购物?...

热门文章

  1. ruby array_Ruby中带有示例的Array.keep_if方法
  2. java getmonth_Java LocalDateTime类| 带示例的getMonth()方法
  3. 读《财务自由之路》教会我的道理
  4. 阿里2020届校招笔试劝退题——你大爷还是你大爷
  5. 页面分栏LayoutInflater
  6. 【博主推荐】Python 基于Xlwings、Openpyxl自己重新封装Python操作Excel类
  7. MyEclipes 2016 CI 6 安装
  8. mariadb与mysql的兼容_「MySQL架构」MariaDB versus MySQL: Compatibility
  9. python自动化测试常见面试题二_思考|自动化测试面试题第二波
  10. java项目怎么导出成jar_如何在eclipse将程序导出成jar文件