1、ArrayList去除集合里面重复的元素(普通类型、引用类型)):
主要步骤:
- 创建新集合
- 老集合获取迭代器
- 遍历老集合
- 如果新集合不包含老集合的元素,就放在新集合里 contains
这个里面有两个坑:
第一个是iterator.next()方法,我们来看一下它的底层是怎么写的
每调用一次,cursor = i + 1;光标(指针)都会加一;
第二个就是我们的ArrayList里面放自己创建的类(比如Student)时,必须重写contains里面的equals方法,因为contains里面用的是Object.equals(),比较的是两个对象的地址值,而我们要改写成比较对象的属性值(姓名、年龄一样我们就看作同一个人)(另外,ArrayList.remove()底层也是o.equals)
iterator.next()源码:
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1; %%%在这里,指针+1
return (E) elementData[lastRet = i];
}
contains源码:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
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])) %%%调用的是o.equals,比较的是地址值!!!
return i;
}
return -1;
}
源代码:
1、创建新集合
2、老集合获取迭代器
3、遍历老集合
4、如果不包含,就放在新集合里 判断是否包含contains底层是用o.equals写的,
5、当我们在List里面加的是自己创建的对象的时候,每个对象都有一个地址值,所以要重写equals,然它比较属性值
method1();基本类型
method2();引用类型
package cn.njupt;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class ArrayReverse {
public static void main(String[] args) {
// method1():去除ArrayList中重复的元素
/*
* 1、创建新集合 2、老集合获取迭代器 3、遍历老集合 4、如果不包含,就放在新集合里 判断是否包含contains底层是用o.equals写的,
* 当我们在List里面加的是自己创建的对象的时候,每个对象都有一个地址值,所以要重写equals,然它比较属性值
*/
method1();
method2();
}
public static void method2() {
ArrayList arr3 = new ArrayList();
arr3.add(new Student("吴彦祖", 23));
arr3.add(new Student("吴彦祖", 23));
arr3.add(new Student("吴彦祖", 23));
arr3.add(new Student("吴彦祖", 23));
arr3.add(new Student("陈冠希", 32));
arr3.add(new Student("陈冠希", 32));
arr3.add(new Student("陈冠希", 32));
arr3.add(new Student("陈冠希", 32));
arr3.add(new Student("林俊杰", 28));
arr3.add(new Student("林俊杰", 28));
arr3.add(new Student("林俊杰", 28));
arr3.add(new Student("林俊杰", 28));
ArrayList arr4 = new ArrayList();
Iterator it3 = arr3.iterator();
while (it3.hasNext()) {
Object obj = it3.next();
if (!arr4.contains(obj)) {
arr4.add(obj);
}
}
Iterator it4 = arr4.iterator();
while (it4.hasNext()) {
System.out.println(it4.next());
}
}
public static void method1() {
ArrayList arr1 = new ArrayList();
arr1.add("a");//arr1.add("a");arr1.add("a");arr1.add("a");arr1.add("a");
arr1.add("b");// arr1.add("b");arr1.add("b");arr1.add("b");
arr1.add("c");
arr1.add("c");
arr1.add("c");
arr1.add("c");
arr1.add("a");
ArrayList arr2 = new ArrayList();
Iterator it1 = arr1.iterator();
while (it1.hasNext()) {
Object obj = it1.next();
if (!arr2.contains(obj)) {
arr2.add(obj);
}
}
Iterator it2 = arr2.iterator();
while (it2.hasNext()) {
System.out.println(it2.next());
}
}
}