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日