A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangruijing 中级黑马   /  2015-3-5 15:42  /  779 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

将自定义对象作为元素存到ArrayList集合中,并去除重复元素
package jihe01;

public class Person {
        private String name;
        private int age;
        public Person(String name,int age)//设置属性值
        {
                this.name=name;
                this.age=age;
        }
        public String getName()//获取name值
        {
                return name;
        }
        public int getAge()//获取age值
        {
                return age;
        }
        //复写Object的Equals方法
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Person))
                        return false;
                Person p=(Person)obj;//强制将obj向下转型
                return this.name.equals(p.getName()) && this.age==p.getAge();
        }

}


package jihe01;

import java.util.ArrayList;
import java.util.Iterator;

/**
* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素
* @author Administrator
*
*/

public class ArrayListTest2 {
        public static void main(String[] args) {
                // TODO Auto-generated method stu
                ArrayList al=new ArrayList();
                al.add(new Person("zhangsan",25));
                al.add(new Person("zhangsan",26));
                al.add(new Person("zhangsan",25));
                al.add(new Person("zhangsan",26));
                al.add(new Person("zhangsan",27));
                al=singleElement(al);
                Iterator it=al.iterator();
                while(it.hasNext())
                {
                        Person p=(Person)it.next();//将元素强制向下转型
                        sop(p.getName()+"---"+p.getAge());
                }
        }
        //定义函数,去除重复元素
        public static ArrayList singleElement(ArrayList al)
        {
                //创建临时容器
                ArrayList newal=new ArrayList();
                Iterator it=al.iterator();
                while(it.hasNext())
                {
                        Object obj=it.next();
                        if(!newal.contains(obj))
                                newal.add(obj);
                }
                return newal;
        }
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}


在ArrayListTest2类的singleElement方法中,明明没有条用Person类中的equals方法,为什么会成功去除Person对象中的重复元素?
帮忙说明一下函数底层的调用原理

2 个回复

倒序浏览
1.首先我指出一个不规范的地方
  ArrayList al = new ArrayList();最好要写上泛型ArrayList<Person> al = new ArrayList<Person>();
2.调用Person类中的equals方法,检验方法
在Person类中的equals中添加输出语句
  1. // 复写Object的Equals方法
  2.         public boolean equals(Object obj) {
  3.                 System.out.println("equals");
  4.                 if (!(obj instanceof Person))
  5.                         return false;
  6.                 Person p = (Person) obj;// 强制将obj向下转型
  7.                 return this.name.equals(p.getName()) && this.age == p.getAge();
  8.         }
复制代码
查看运行结果:



3.调用的原理和比较,可以查看API文档


4.建议
对于去掉重复元素,也可以用比较器,也可以自定义比较规则
希望可以帮助到你。

回复 使用道具 举报
谢谢你的分析及建议
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马