黑马程序员-集合(二)contains()方法的内部探索
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
我们知道集合是用来存储对象的。在他们实现了众多的接口我们以Arraylist为列子
所有已实现的接口:
Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
集合当中有这样的一个方法。在API文档当中是下面这样解释的。
其实我在查看源代码的时候:代码如下。其实就是调用了对象的equals()方法,进行比较。如果相等,那么返回Ture
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++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
我们我们就会有一个问题:
我们比较如String对象的话我们可以直接比较。因为只要地址相同说明在栈里面的值就是统一代码块。final的作用。
而如果我们比较的是对我们应该怎么比较呢?
因为我们在object当中保存的是我们创建对象的引用(也就是地址),
在Java当我我们判断两个对象是是否相等我们要重新equal()方法,设置自己判断自己相同的条件
class Person
{
public String name ;
public int age ; public Person(String name ,int age)
{
this.name = name;
this.age = age; }
//重写一个equals方法
public boolean equals(Object obj)
{
//判断对象是否相同.
//1.先看他是否是Person对象
//2.比较字段值是否相同
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
}
所以我们在集合当中用contains方法查找是否包含当前对象时我们就应该重写equal()方法
小测试:删除一个集合当中重复的元素。 而这个元素是我们自己定义的对象
package com.text; import java.util.ArrayList;
import java.util.Iterator; import com.sun.org.apache.bcel.internal.generic.NEW; public class List
{ public static void main(String[] args)
{
//创建长度为10的
ArrayList lang = new ArrayList();
lang.add(new Person("zhulang",13));
lang.add(new Person("zhulang",42));
lang.add(new Person("zhulang",13));
lang.add(new Person("zhulang",42));
lang.add(new Person("zhulang",13));
lang.add(new Person("zhulang",42)); lang = singleElement(lang); //我就用迭代器输出吧。
for(Iterator it = lang.iterator(); it.hasNext();)
{
Person p = (Person)it.next();
System.out.println(p.name + p.age);
} }
//去除重复元素的方法
public static ArrayList singleElement( ArrayList al)
{
//用到conkd
ArrayList newAL = new ArrayList();
//创建查找。 如果第一次存在我我们记录。如果在有同样的内容我们就不添加
//创建迭代器我们反复的查找
Iterator it= al.iterator();
while(it.hasNext())
{
Object ob = it.next();
if (!newAL.contains(ob))
{
//如果新的没有我们就添加。有就不添加
//实际上调用的是对象的equal()方法:
newAL.add(ob);
}
} return newAL;
} } //定义一个人的类
class Person
{
public String name ;
public int age ; public Person(String name ,int age)
{
this.name = name;
this.age = age; }
//重写一个equals方法 判断对象相等的条件
public boolean equals(Object obj)
{
//判断对象是否相同.
//1.先看他是否是Person对象
//2.比较字段值是否相同
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
}
输出:
zhulang 13
zhulang 14
黑马程序员-集合(二)contains()方法的内部探索的更多相关文章
- [黑马程序员] 集合框架2——Map系 & 集合工具类(Collections、Arrays)
---------------------- ASP.Net+Android+IO开发..Net培训.期待与您交流! ---------------------- 0. 集合框架按其所实现的接口, 大 ...
- 黑马程序员:轻松精通Java学习路线连载1-基础篇!
编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...
- 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具
Java学习路线图引言: 黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...
- 课程10:《黑马程序员_Hibernate开发资料》视频目录--没有细看
老师很厉害,讲得蛮详细的 \Hibernate视频教程\01_黑马程序员_Hibernate教程__Hibernate入门基础.avi; \Hibernate视频教程\02_黑马程序员_Hiberna ...
- 黑马程序员——【Java高新技术】——代理
---------- android培训.java培训.期待与您交流! ---------- 一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法 ...
- 黑马程序员—C语言的函数、数组、字符串
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参 ...
- 黑马程序员:Java基础总结----泛型(高级)
黑马程序员:Java基础总结 泛型(高级) ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...
- 黑马程序员:Java基础总结----类加载器
黑马程序员:Java基础总结 类加载器 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...
- 黑马程序员:3分钟带你读懂C/C++学习路线
随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...
随机推荐
- JavaScript元素的创建、添加、删除
<script> var x=document.getElementById("p2"); var obj=document.createElement("p ...
- BZOJ_1202_狡猾的商人_(并查集)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1202 n 个月的账单,共 m 组数据,每一组数据包括 x , y , t ,表示从 x 月到 ...
- WebLogic12c 注册windows系统服务
1.确认操作系统环境变量中的JAVA_HOME=D:\Oracle\Middleware\jdk160_29与安装部署的位置保持一致: 2.编辑D:\Oracle\Middleware\wlserve ...
- Unity3D常见技术点(持续更新)
一:获取对象, 添加对象等 1:使用prefab生成对象 GameObject ballObj = GameObject.Instantiate(Resources.Load(, Quaternion ...
- Makefile自动生成头文件依赖
前言 Makefile自动生成头文件依赖是很常用的功能,本文的目的是想尽量详细说明其中的原理和过程. Makefile模板 首先给出一个本人在小项目中常用的Makefile模板,支持自动生成头文件依赖 ...
- Sql Server CONVERT获取当前日期及日期样式
Sql Server CONVERT获取当前日期及日期样式(转)(2012-06-06 12:00:24) 转载▼ // 标签: 杂谈 分类: SQL Sql Server CONVERT样式 获取当 ...
- 【转】.NET 三层架构 中 DAL+IDAL+Model+BLL+Web
其实三层架构是一个程序最基本的 在.Net开发中通常是多层开发 比如说 BLL 就是business Logic laywer(业务逻辑层) 他只负责向数据提供者也就是DAL调用数据 然后传递给 客户 ...
- selenium webdriver(2)---页面对象定位
webdriver的元素定位很灵活,提供了多种定位方式: Id LinkText PartialLinkText Name TagName Xpath ClassName CssSelector 这些 ...
- ARM学习笔记14——C语言和汇编相互套用
这里,我们要准备两个文件,一个是汇编文件start.S,另一个是C文件led.c.汇编文件套用C文件中的开关灯函数,C文件套用汇编文件中延时函数. //start.S .global led_init ...
- Chrome 控制台实用指南【转】
转自伯乐在线. Chrome 控制台实用指南 前言 Chrome浏览器我想是每一个前端er必用工具之一吧,一部分原因是它速度快,体积不大,支持的新特性也比其它浏览器多,还有一部分我想就是因为它的控制台 ...