java集合的contains(obj)方法的实现
在实际项目中我们通常会有一个需求就是:想知道在一个列表中是否包含某一个对象
这里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)方法的实现的更多相关文章
- java学习-Comparable<Integer>接口方法的实现
基本数据类型的包装类Integer, Float, Double,Long,Byte等都实现的Comparable接口,用于列表List或数组arrays的排序 Comparable<Integ ...
- 关于Java中常用加密/解密方法的实现
安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...
- 【Java安全】关于Java中常用加密/解密方法的实现
安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...
- Java—集合框架 List的 indexOf()、lastIndexOf()
集合中某个元素出现的位置—List的indexOf(),lastIndexOf() indexOf(Object obj)方法的实现机制是从序列(List)的第0个元素开始依次循环,并且调用每个元素的 ...
- 05_动手动脑之String.equals()方法的实现代码
Question: 请查看String.equals()方法的实现代码,注意学习其实现方法. Answer: java中的String.equals()方法的实现代码: equals()法是根类Obj ...
- 关于Java中hashCode方法的实现源码
首先来看一下String中hashCode方法的实现源码. public int hashCode() { int h = hash; if (h == 0 && value.leng ...
- Java集合框架实现自定义排序
Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...
- Java集合面试题
1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1 ...
- 【JAVA集合框架之Set】
一.Set概述. Set集合的特点是元素不允许重复,而且是无序的(添加和取出的顺序不一致). Set接口中的方法和Collection接口中的方法几乎相同,略. Set接口下常用的两个类:HashSe ...
随机推荐
- 工作中常用的Linux命令
1.从其他机器拷贝文件夹 格式: scp -r 文件夹名 用户名@机器名:/路径 范例: scp -rsearch work@zjm-testing-ps23.zjm.baidu.com:/home/ ...
- Chipmunk僵尸物理对象的出现和解决(一)
最近在写的BrickHit游戏App中出现了一个比较头疼的问题. 该问题很难用常规手段调试,因为其发生看起来貌似是随机的. 我想在这里将这个问题的现象和解决过程详细的记录下来,一来避免其他童鞋走弯路, ...
- OJ题:奇偶归一猜想——求归一过程中的最大值
题目: 题目内容: 奇偶归一猜想--对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1. 如n = 11,得序列:11, 34, 17, 52, ...
- 5、使用Libgdx设计一个简单的游戏------雨滴
(原文:http://www.libgdx.cn/topic/49/5-%E4%BD%BF%E7%94%A8libgdx%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E7% ...
- Leetcode_171_Excel Sheet Column Number
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42290079 Given a column title a ...
- Hive 配置
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="confi ...
- Win8 HTML5与JS编程学习笔记(二)
近期一直受到win8应用的Grid布局困扰,经过了半下午加半个晚上的奋斗,终于是弄明白了Grid布局方法的规则.之前我是阅读的微软官方的开发教程,书中没有详细说明CSS3的布局规则,自己鼓捣了半天也是 ...
- LeetCode之“树”:Symmetric Tree && Same Tree
Symmetric Tree 题目链接 题目要求: Given a binary tree, check whether it is a mirror of itself (ie, symmetric ...
- 新版MATERIAL DESIGN 官方动效指南(二)
继上一篇,本文继续第二部分,从动效的速度.动态持续时间.通用持续时间和缓动曲线4个部分,教你创建平滑一致的Material Design 动效.再系统的干货都比不上官方的动效指南,西瓜就在这,赶紧来捡 ...
- android 高仿京东
android 高仿京东源码,两年前的作品,最近发现一些老代码,发布出来给初学者学习,下面附上几张展示的效果,有需要的请到下面地址下载,记得stare哦 https://github.com/xian ...