当往ArrayLIst中存储自定义对象时,一般要去除重复的元素,比如传进来学生,之前我们定义了AraayList去除重复元素的两个方法,其实根本上都是用的对象的equals方法,contains底层也是调用的equals方法,String 就不需要我们重写了,但是自定义对象不同,它比的是内存地址。我往ArrayList
存储两次 list.add(new Student(" zhangsan",27)),这两个学生的地址是不同的,这个时候需要我们重写学生类(自定义对象类)的equasl方法,建立他自己的判断重复的依据。实现代码如下、
package com.runoob.Collection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; class Person{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person() { super(); // TODO Auto-generated constructor stub } public Person(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } /** * 建立Person类自己的判断对象是否相同的依据 */ public boolean equals(Object obj){ //为了提高效率,如果比较的对象是同一个,直接返回true if(this==obj) return true; //这里是判断是否为一个类型 if(!(obj instanceof Person)){ throw new ClassCastException("类型错误"); } System.out.println(this+"==============="+obj); Person p =(Person)obj; return this.name.equals(p.name)&&this.age==p.age; } } /* * ArrayList取出重复元素的两种方法 */ public class ListItertorDemo { public static void main(String[] args) { List list = new ArrayList(); Person p1=new Person("haha",21); Person p2=new Person("gaga",22); Person p3=new Person("hihi",23); Person p4=new Person("hoho",24); list.add(p1); list.add(p2); list.add(p3); list.add(p4); list.add(p1); list.add(p2); list.add(p3); list.add(p4); // for (Iterator it = list.iterator(); it.hasNext();) { // Person per = (Person) it.next(); // System.out.println(per); // } System.out.println(list); singleElement(list); System.out.println(list); } //去除重复的方法之一 public static void singleElement(List list){ List temp = new ArrayList(); for (Iterator it = list.iterator(); it.hasNext();) { Object obj = (Object) it.next(); if(!temp.contains(obj))//contains调用的就是equals方法 temp.add(obj); } list.clear(); list.addAll(temp); } }