ArrayList:底层数据结构是数组、
优点:查询快速。
缺点:增删慢。
我们先来试试它的特性:
import java.util.*; public class ArrayListDemo { public static void main(String[] args) { ArrayList al = new ArrayList(); Add(al); sop(al); } public static void Add(ArrayList al) { al.add("java01"); al.add("java02"); al.add("java03"); al.add("java04"); } public static void sop(Object obj) { System.out.println(obj); } }
运行结果:
[java01, java02, java03, java04]
当有重复元素的时候、我们再来看看:
public static void Add(ArrayList al) { al.add("java01"); al.add("java02"); al.add("java03"); al.add("java02"); al.add("java04"); al.add("java04"); }
运行结果:
[java01, java02, java03, java02, java04, java04]
可见、 ArrayList并没有自动去除重复元素的功能、 这样我们只能自己来进行去除了:
import java.util.*; public class ArrayListDemo { public static void main(String[] args) { ArrayList al = new ArrayList(); Add(al); sop(al); sop("————————————————————————"); al = DropRepeat(al); sop(al); } public static ArrayList DropRepeat(ArrayList al) { ArrayList newAl = new ArrayList(); for (Iterator it = al.iterator(); it.hasNext() ; ) { Object obj = it.next(); if (!newAl.contains(obj)) newAl.add(obj); } return newAl; } public static void Add(ArrayList al) { al.add("java01"); al.add("java02"); al.add("java03"); al.add("java02"); al.add("java04"); al.add("java04"); } public static void sop(Object obj) { System.out.println(obj); } }
运行结果:
[java01, java02, java03, java02, java04, java04]
————————————————————————
[java01, java02, java03, java04]
因为ArrayList不同于HashSet和TreeSet、 后者只要元素具有比较性、底层就会自动进行比较去重、但是ArrayList无此功能、 底层数据结构不同。
所以我们需要写个方法来进行去重。
那么我们来进行存储自定义对象 并进行去重来试一下:
import java.util.*; public class ArrayListDemo { public static void main(String[] args) { ArrayList al = new ArrayList(); Add(al); show(al); sop("————————————————————————"); al = DropRepeat(al); show(al); } public static ArrayList DropRepeat(ArrayList al) { ArrayList newAl = new ArrayList(); for (Iterator it = al.iterator(); it.hasNext() ; ) { Object obj = it.next(); if (!newAl.contains(obj)) newAl.add(obj); } return newAl; } public static void show(ArrayList al) { for (Iterator it = al.iterator(); it.hasNext() ; ) { Person p = (Person)it.next(); sop(p.getName() + "->" + p.getAge()); } } public static void Add(ArrayList al) { al.add(new Person("tian01", 19)); al.add(new Person("tian03", 29)); al.add(new Person("tian04", 31)); al.add(new Person("tian02", 24)); al.add(new Person("tian03", 29)); al.add(new Person("tian02", 24)); } public static void sop(Object obj) { System.out.println(obj); } } 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; } }
运行结果:
tian01->19
tian03->29
tian04->31
tian02->24
tian03->29
tian02->24
————————————————————————
tian01->19
tian03->29
tian04->31
tian02->24
tian03->29
tian02->24
然而、这并没有什么卵用、 到底哪里错了呢? (我会说我因此而卡住很久了吗?)
还是要从底层来想、 那么既然都是比较、 那么肯定调用了equals方法, 我们重写Person的equals方法来测试一下:
public boolean equals(Object obj) { System.out.println(this.name + "...equals...."); return true; }
运行结果:
tian03...equals....
tian04...equals....
tian02...equals....
tian03...equals....
tian02...equals....
测试结果说明我们的猜测是对的、 那么只有重写equals方法、指定我们比较的标准就可以依照我们的想法来进行去重了。
我们来复写一下:
public boolean equals(Object obj) { if (!(obj instanceof Person)) return false; Person p = (Person)obj; return this.name.equals(p.name) && this.age == p.age; }
运行结果:
tian01->19
tian03->29
tian04->31
tian02->24
tian03->29
tian02->24
————————————————————————
tian01->19
tian03->29
tian04->31
tian02->24
结果表明 成功去重! 我们可以看一下它是怎么进行比较的 可以修改代码测试一下:
public boolean equals(Object obj) { if (!(obj instanceof Person)) return false; Person p = (Person)obj; System.out.println(this.name + "...equals..." + p.name); return this.name.equals(p.name) && this.age == p.age; }
运行结果:
tian03...equals...tian01
tian04...equals...tian01
tian04...equals...tian03
tian02...equals...tian01
tian02...equals...tian03
tian02...equals...tian04
tian03...equals...tian01
tian03...equals...tian03
tian02...equals...tian01
tian02...equals...tian03
tian02...equals...tian04
tian02...equals...tian02
tian01->19
tian03->29
tian04->31
tian02->24
从上得知确实进行了比较、调用了equals方法并且去重!
记录一下。。 2015年6月2日