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

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