黑马程序员-集合(二)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++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...
随机推荐
- ArrayList集合排序
using System;using System.Collections;using System.Collections.Generic;using System.Text; namespace ...
- bzoj1042
首先直接做多重背包肯定会TLE的, 观察这个背包问题有什么特殊性呢 物品种类和重量,价值是一定的,不同的是背包的容量和物品的数量 由于当物品数量没有限制的时候,方案数是可以预处理出来的 所以我们考虑用 ...
- Oracle坑之-空字符串与NULL
空字符串与NULL 首先有如下代码 SELECT * FROM Pdc_DataDomain DD INNER JOIN Pdc_DD_Table DDT ON DD.DataDomainID = D ...
- 【转】 Android——eclipse共享library以及导出jar包
原文网址:http://blog.csdn.net/jscese/article/details/36627195 android的apk在在eclipse上进行开发的时候,有时候需要import其它 ...
- 特性扩展:WebActivatorEx
WebActivator: PreApplicationStartMethod 属性,用于标记作为东西您获取 Web 应用程序启动时调用的方法,在Application_Start前. PostApp ...
- Object-c 基础总结
1,nil,NULL,NSNull:nil用来给对象附值,object—c里允许对象为空,空对象也可以接受消息.但是不允许指针为空,NULL是给任何指针附值的.所以NULL只在C或C++里才用.NSN ...
- Test2014-3-1 魅力值比较
魅力值比较 [问题描述] 大学生恋爱的问题造成了数量众多的异地恋,有许多J大的女生早早被Q大男生追走,这导致了J大男生的强烈不满.就在吐血高调地向一位J大美女展开攻势的之后,J大男生终于爆发了. 为了 ...
- linux下在多个文件夹中查找指定字符串的命令
例如,想要在当前文件夹下的多个.c或者.txt文件中查找“shutdown”字符串, 可以使用“grep shutdown ./*.c”或“grep shutdown ./*.txt”即可 使用fin ...
- Java的MongoDB驱动及读写策略
网上看见一篇博文,详细讲了MongoDB读写策略,将来生产会遇到类似的问题,转来备查. 指定新mongo实例: Mongo m = new Mongo(); Mongo m = new Mongo( ...
- Uniform resource name
A uniform resource identifier (URI) is a uniform resource locator(定位器,探测器) (URL), uniform resour ...