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日

时间: 2024-10-17 23:25:34

ArrayList的初步了解的相关文章

天梯匹配系统 - 简单实现

最近利用业余时间开发一个支持多人对战游戏的天梯匹配系统,纯粹练手之用.该天梯系统需要满足以下要求 1. 有单人对战和多人对战模式,例如从1v1到5v5 2. 每个人都有两个天梯分,分别是1v1的天梯分,和2v2或以上对战的天梯分 3. 每局匹配的最高分和最低分玩家分差不能超过设定值 4. 每局匹配双方间分差不能超过设定值 5. 每个人可和一名或多名好友组队共同参与天梯匹配,组队后系统将计算组内天梯值平均分并适量加成作为匹配依据 6. 成功的匹配必须在对战双方同时包含相同的黑店数量. 7. 玩家选

【金阳光测试】Android自动化 -- 学习历程:Robotium原理初步

章节:自动化基础篇——Monkey原理初步和改良优化(第四讲) 网易云课堂: http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=876095&courseId=712011 主要讲解内容与笔记: 一.基于控件 1.spinner——下拉菜单 2.TabHost——左右滑动选择菜单,类似电话本 3.Gallery——图形 4.Progressbar——进度条 5.DatePicker—

Dagger2 使用初步

Dagger2 是一个Android依赖注入框架,由谷歌开发,最早的版本Dagger1 由Square公司开发.依赖注入框架主要用于模块间解耦,提高代码的健壮性和可维护性.Dagger 这个库的取名不仅仅来自它的本意“匕首”,同时也暗示了它的原理.Jake Wharton 在对 Dagger 的介绍中指出,Dagger 即 DAG-er,这里的 DAG 即数据结构中的 DAG——有向无环图(Directed Acyclic Graph).也就是说,Dagger 是一个基于有向无环图结构的依赖注入

【金阳光测试】Android自动化 -- 学习历程:Appium原理初步

章节:自动化基础篇——Appium原理初步(第七讲) 金阳光测试官网: http://www.goldensunshine.cc/forum.php?mod=viewthread&tid=19&extra=page%3D2 本期关键词: Appium.跨语言跨平台.Bootstrap 主要讲解内容及笔记: 一.what is appium 一种封装了uiautomator.或者其他测试框架的自动化测试框架,跨平台(支持linux.mac.windows).跨语言(几乎所有的我知道的语言都支

贪吃蛇小游戏的初步尝试制作

这里利用二维数组做为地图,利用集合来存放蛇头和蛇尾的位置坐标,初步实现一个需要键盘控制的贪吃蛇小游戏. 首先,Main函数下面需要一个大循环来让游戏失败的时候能够重新开始,这里我们用了定义了一个bool型的sc,判断sc的true和flase来确定游戏是否开始: static void Main(string[] args)        { bool sc = true; while (sc) //大循环,用于游戏失败重新开始            { 下面是定义一个集合snake_x来存放蛇

Servlet初步

@WebServlet("/HelloServlet") public class HelloServlet extends HttpServlet {     private static final long serialVersionUID = 1L;          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IO

Retrofit2.0 的初步使用

Retrofit2.0 的初步使用 首先我就不介绍了,直接说下怎么使用,本身我也是刚刚因为要仿照微软的azure-sdk-for-java(git地址是:https://github.com/Azure/azure-sdk-for-java.git) 然后去编写一个类似的程序里面就设计到了Retrofit. 我也是刚刚才使用所以说叫我讲啥原理我肯定不怎么会讲,所以这里就是告诉大家怎么使用,里面可能有些代码不怎么好,希望大家一起指出来,我会慢慢改正,请大家见谅. 首先我是把Retrofit跟OkH

Java 集合框架初步

Java 集合框架 JCF(Java Collections Framework) Collections Collection提供关于集合的一些通用操作的接口 包括: 插入add() 删除remove() 判断一个元素是不是其成员contains 遍历iterator() List--有序集合 Set--无序集合,不予许存在重复值 Map--映射 集合初步 熟悉使用ArrayList 开始学会使用jdk的api文档 ArrayList----List接口的一个实现 有序,允许存在重复值 imp

初步探讨WPF的ListView控件(涉及模板、查找子控件)

本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmlns:c="clr-namespace:System.Collections;assembly=mscorlib" 然后代码如下:   <c:ArrayList x:Key="stuList">            <local:Student Id=