黑马程序员-集合(二)contains()方法的内部探索

时间:2021-11-02 19:57:50

------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