在实际项目中我们通常会有一个需求就是:想知道在一个列表中是否包含某一个对象

这里ArrayList表、HashSet表和HashMap表都提供了一个contains(obj)方法,

下面说一下两个列表contains(obj)方法的实现原理。

ArrayList表:

先遍历表中每个元素(对象),然后对每个元素执行一个equals(obj)方法,该方法返回

一个布尔值。然而,通常我们查询的时候并不会将一个对象的所有属性值都输入,可能

只输入一个具有代表性的属性值,比如name属性,这个时候就要我们来修改equals(obj)

方法了,在内部if语句比较的时候只比较obj.name属性值和当前列表元素的name属性值。

public boolean equals(Object obj) {
              if (this == obj)
                      return true;                  //比较对象和当前元素相同,返回true
              if (obj == null)
                      return false;                //比较对象为空,返回false
              if (!(obj instanceof Courses))
                      return false;                //比较对象类型和当前元素不同,返回false
              Courses other = (Courses) obj;
              if (name == null) {
                      if (other.name != null)
                                 return false;     //当前元素name为空,而比较对象name不为空,返回false
              } else if (!name.equals(other.name))
                      return false;                //当前元素name和比较对象name不相同,返回false

return true;                         //排除以上因素后,该函数才返回true
}

HashSet表:

值得一提的是,HashSet表的contains(obj)方法实现,不仅要比较属性值字段是否匹配,还要

比较哈希码值(经过哈希算法返回的一个int型数据),两者都为true,contains(obj)方法才返

回true。于是我们就还要再重写一下表内对象的hashCode()函数来只返回特定属性值(name)

的哈希码值。

public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
}

注意,这是eclipse软件生成的hashCode()函数,只返回name属性的哈希码值,其实函数内部

真正有意义的只有黑色加粗的这个hashCode()函数,这个函数的具体算法我们不做深究,result只

是对name的哈希码值作进一步处理。切记,蓝色的hashCode()函数是我们自己定义的,而黑色加粗

的hashCode()函数是引自java的哈希码算法函数,不要搞混了!!!

有兴趣的同学可以看一下哈希算法是怎么实现的~~~

HashMap表:

Map表由于是键值对的形式,所以就有两种contains()方法:containsKey(Key)和containsValue(obj)

containsKey(Key)方法很明显,传入一个Key值,然后进行键值的匹配。

而containsVaule(obj),由于是一个对象,匹配的时候会根据具体属性来匹配,这就需要重写指定属性例如

name的equals(obj)方法。另外提一点,containsVaule(obj)里面的obj可以这样写new Course(null,name),

因为比较的时候只比较了obj.name属性,所以id属性可以索性为空(null)!

还有个方法内部实现也用到equals(obj),list.indexOf(obj),将obj与List列表的每一项,用equal(obj)逐个比较,

当然也只是比较特定属性,当equals()方法返回true时,将此项的索引值返回给indexOf(obj)函数。

java集合的contains(obj)方法的实现的更多相关文章

  1. java学习-Comparable<Integer>接口方法的实现

    基本数据类型的包装类Integer, Float, Double,Long,Byte等都实现的Comparable接口,用于列表List或数组arrays的排序 Comparable<Integ ...

  2. 关于Java中常用加密/解密方法的实现

    安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...

  3. 【Java安全】关于Java中常用加密/解密方法的实现

    安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...

  4. Java—集合框架 List的 indexOf()、lastIndexOf()

    集合中某个元素出现的位置—List的indexOf(),lastIndexOf() indexOf(Object obj)方法的实现机制是从序列(List)的第0个元素开始依次循环,并且调用每个元素的 ...

  5. 05_动手动脑之String.equals()方法的实现代码

    Question: 请查看String.equals()方法的实现代码,注意学习其实现方法. Answer: java中的String.equals()方法的实现代码: equals()法是根类Obj ...

  6. 关于Java中hashCode方法的实现源码

    首先来看一下String中hashCode方法的实现源码. public int hashCode() { int h = hash; if (h == 0 && value.leng ...

  7. Java集合框架实现自定义排序

    Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...

  8. Java集合面试题

    1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1 ...

  9. 【JAVA集合框架之Set】

    一.Set概述. Set集合的特点是元素不允许重复,而且是无序的(添加和取出的顺序不一致). Set接口中的方法和Collection接口中的方法几乎相同,略. Set接口下常用的两个类:HashSe ...

随机推荐

  1. CentOS6 上OpenWRT交叉编译

    目的不是为了编译固件,而是为了一个是编译可执行文件,放倒op的路由器上跑,另一个目的是安装一些开源软件折腾下(例如ss-lib),需要打包成 .ipk 格式 路由设备信息 erya@ERYA:~$ c ...

  2. Android进阶(十一)Android系统架构讲解

    如果说一个成功男人的背后会有一个默默支持的女人的话,那么一个优越稳定的平台背后必有一个成熟的系统架构所支撑着.那么,Android的系统架构是怎么样的呢?从下图我们可以从整体上有个大致的了解(图片来源 ...

  3. JAVA对象克隆可能会出现的问题

    首先,区分一下拷贝和克隆: 拷贝:当拷贝一个变量时,原始变量与拷贝变量引用的是同一个对象.当改变一个变量所引用的对象,则会对另一个变量造成影响. 克隆:当克隆一个对象时,是重新的创建了和该对象内容相同 ...

  4. PCA与特征选取

    一.什么是PCA PCA,即PrincipalComponents Analysis,也就是主成份分析: 通俗的讲,就是寻找一系列的投影方向,高维数据按照这些方向投影后其方差最大化(方差最大的即是第一 ...

  5. VMware中安装系统提示没有可用的映像(No image available)

    今天新建了个虚机在装系统的时候提示"没有可用的映像" 之所以会出现这种情况是因为在新建虚机的时候选择的设置不同导致的,此处不管选第一项还是第二项都会虚机设置中多了一个软盘的配置项, ...

  6. 小强的HTML5移动开发之路(8)——坦克大战游戏2

    来自:http://blog.csdn.net/cai_xingyun/article/details/48629015 在上一篇文章中我们已经画出了自己的坦克,并且可以控制自己的坦克移动,我们继续接 ...

  7. ARM v7汇编与相关练习

    程序入口: _startc 语言入口: main@:              注释;main:           标签;伪指令:         给汇编器读的指令;.global main    ...

  8. AngularJS进阶(三十三)书海拾贝之简介AngularJS中使用factory和service的方法

    简介AngularJS中使用factory和service的方法 AngularJS支持使用服务的体系结构"关注点分离"的概念.服务是JavaScript函数,并负责只做一个特定的 ...

  9. 一个优化极点的ViewHolder

    代码中有注释: 使用方法: 1.可以在listview,gridview,stageView直接继承LazyAdapter使用 2.下面有Demo 代码 ViewHolder代码: import an ...

  10. SpriteBuilder中不能编辑自定义类或不能给节点添加属性的解决

    不能编辑自定义类 你选中一个Sub File(CCBFile)节点,在这个例子中,该节点的Custom class区域灰化禁用且不能修改.这是因为你需要在该Sub File引用的CCB文件中修改Cus ...