当往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);
}
}