3.取出。
import java.util.*; class ArrayListText { public static void main(String []args) { ArrayList al=new ArrayList(); al.add(new person("lishi",5)); al.add(new person("lishi01",6)); al.add(new person("lishi02",7)); al=singleElements(al); /*不能去除相同元素*/ Iterator it=al.iterator(); while(it.hasNext()) { // sop(it.next().getName) /*这样编译失败,因为it.next返回值是Object,而且add(Object obj),需要进行强制类型转换。*/ person p=(person)it.next(); sop(p.getName()+"......"+p.getAge()); } } public static ArrayList singleElements(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; } } class person { private String name; private int age; person(String name,int age) { this.name=name; this.age=age; } public String getName() { return name; } public int getAge() { return age; } } 不能去除相同元素,因为contains底层调用了indexOf(object obj)方法,返回指定对象的索引。
而此方法底层调用了指定对象(obj)的 equals方法。 比较数组中的元素 (ArrayList底层数据结构是数组) 是否与此对象地址相同,相同为同一元素,返回元素索引。没有相同元素返回-1。
然后contains用index返回的数值比较,大于等于0,是true,说明包含指定元素。小于0,是false,说明不包含指定元素。 而现在比较的是年龄和姓名,所以需要复写指定对象也就是person的equals方法。
public boolean equals(Object obj) { person p=(person)obj; return this.name.equals(p.getName()) && this.age==p.getAge(); } list集合中判断元素是否相同,用的是元素的equals方法,如 :remove contains方法