zoukankan      html  css  js  c++  java
  • 黑马程序员-集合(二)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

  • 相关阅读:
    shh登入不能自动执行.bashrc
    Markdown 公式指导手册
    机器学习(ML)十六之目标检测基础
    机器学习(ML)十五之梯度下降和随机梯度下降
    机器学习(ML)十四之凸优化
    机器学习(ML)十三之批量归一化、RESNET、Densenet
    机器学习(ML)十二之编码解码器、束搜索与注意力机制
    机器学习(ML)十一之CNN各种模型
    机器学习(ML)十之CNN
    机器学习(ML)九之GRU、LSTM、深度神经网络、双向循环神经网络
  • 原文地址:https://www.cnblogs.com/ganwei/p/4559608.html
Copyright © 2011-2022 走看看