码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-06-07 23:27:47      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

------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()方法的内部探索

标签:

原文地址:http://www.cnblogs.com/ganwei/p/4559608.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!