ArrayList的初步了解

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日

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值