码迷,mamicode.com
首页 > 其他好文 > 详细

ArrayList的初步了解

时间:2015-06-02 11:24:51      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

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日

ArrayList的初步了解

标签:

原文地址:http://blog.csdn.net/acm_th/article/details/46323229

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!