------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

我们知道集合是用来存储对象的。在他们实现了众多的接口我们以Arraylist为列子

所有已实现的接口:

Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess

集合当中有这样的一个方法。在API文档当中是下面这样解释的。

contains(Object o)
如果此列表中包含指定的元素,则返回 true

其实我在查看源代码的时候:代码如下。其实就是调用了对象的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()方法的内部探索的更多相关文章

  1. [黑马程序员] 集合框架2——Map系 & 集合工具类(Collections、Arrays)

    ---------------------- ASP.Net+Android+IO开发..Net培训.期待与您交流! ---------------------- 0. 集合框架按其所实现的接口, 大 ...

  2. 黑马程序员:轻松精通Java学习路线连载1-基础篇!

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

  3. 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具

        Java学习路线图引言:        黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...

  4. 课程10:《黑马程序员_Hibernate开发资料》视频目录--没有细看

    老师很厉害,讲得蛮详细的 \Hibernate视频教程\01_黑马程序员_Hibernate教程__Hibernate入门基础.avi; \Hibernate视频教程\02_黑马程序员_Hiberna ...

  5. 黑马程序员——【Java高新技术】——代理

    ---------- android培训.java培训.期待与您交流! ---------- 一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法 ...

  6. 黑马程序员—C语言的函数、数组、字符串

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参 ...

  7. 黑马程序员:Java基础总结----泛型(高级)

    黑马程序员:Java基础总结 泛型(高级)   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...

  8. 黑马程序员:Java基础总结----类加载器

    黑马程序员:Java基础总结 类加载器   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...

  9. 黑马程序员:3分钟带你读懂C/C++学习路线

    随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...

随机推荐

  1. NOI2005瑰丽华尔兹

    1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 893  Solved: 508[Submit][Status] ...

  2. Grading

    100 >= A >= 93 > A- >= 90; 90 > B+ >= 87 > B >= 83 > B- >= 80; 80 > ...

  3. GridControl控件添加按钮列及在按钮Click事件中得到行数据 zt

    在GridControl中添加按钮列的步骤如下: 1. 把列的ColumnEdit属性设置为RepositoryItemButtonEdit 2. 把TextEditStyle属性设置为HideTex ...

  4. [转]NHibernate之旅(4):探索查询之条件查询(Criteria Query)

    本节内容 NHibernate中的查询方法 条件查询(Criteria Query) 1.创建ICriteria实例 2.结果集限制 3.结果集排序 4.一些说明 根据示例查询(Query By Ex ...

  5. (DT系列二)device tree的书写规范

    devicetree的书写规范 下面从节点,属性,reg,ranges,中断控制器等几个方面叙述devicetree的书写规范. 1,dts的基本元素:节点 .dts(或者其include的.dtsi ...

  6. Javascript数据类型——undefined和null的异同

    Javascript的基本数据类型中有undefined和null两种只有一个值得特殊数据类型.其中undefined表示未被初始化,不是为声明.而null表示一个空对象指针,而这也是使用typeof ...

  7. linux内核数据结构--进程相关

    linux里面,有一个结构体task_struct,也叫“进程描述符”的数据结构,它包含了与进程相关的所有信息,它非常复杂,每一个字段都可能与一个功能相关,所以大部分细节不在我的研究范围之内,在这篇文 ...

  8. 用slf4j统一管理日志总结

    用slf4j统一管理日志总结 参考网页:http://www.slf4j.org/ 一.使用slf4j统一管理并配置统一使用log4j日志 使用的jar:(slf4j-api-1.7.5.jar,jc ...

  9. 跟着百度学PHP[7]会话控制(session与cookie) 1.cookie的设置

    参考慕课网:http://www.imooc.com/learn/26 参考W3C:http://www.w3school.com.cn/php/php_cookies.asp setcookie() ...

  10. easyui在当前tab中直接加载url

    var tab = $('#mainTabs').tabs('getSelected'); // get selected panel $('#mainTabs').tabs('update', { ...