`
xiaodpro
  • 浏览: 3051 次
  • 性别: Icon_minigender_1
  • 来自: 岳阳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

模拟ArrayList类的实现

阅读更多
此例展示了ArrayList的存储实现,刚学集合类框架,希望对初学者有所借鉴,帮助理解ArrayList的用法等。此例不免有些许错误,还望各位高手指出。
package com.xiaodpro.util;

/**
 * 模拟ArrayList类的实现
 * @author xiaodpro
 * 	2010年3月7日
 * @param <E>
 */
public class ArrayList<E>{

	private Object[] elementData;
	private int increment;

	/**
	 * 创建一个默认大小及默认增长量的ArrayList
	 */
	public ArrayList() {
		// 创建一个默认大小的ArrayList
		this(10);
	}

	/**
	 * 创建一个指定初始大小的ArrayList
	 * 
	 * @param initSize
	 *            初始大小
	 */
	public ArrayList(int initSize) {
		this(initSize, 10);
	}

	/**
	 * 创建一个指定初始大小及增长量的ArrayList
	 * 
	 * @param initSize
	 *            初始大小
	 * @param increment
	 *            增长量
	 */
	public ArrayList(int initSize, int increment) {
		if(initSize < 10 || increment < 5)
			throw new IllegalArgumentException();
		this.elementData = new Object[initSize];
		this.increment = increment;
	}

	/**
	 * 添加一个元素
	 * @param item 待添加的元素
	 */
	public void add(E item) {
		// TODO Auto-generated method stub
		add(item,size());
	}

	/**
	 * 向指定索引处添加一项
	 * 
	 * @param item
	 *            待添加的元素
	 * @param index
	 *            指定索引
	 */
	public void add(E item, int index) {
		if(index < 0 || index > size())
			throw new ArrayIndexOutOfBoundsException();

		while (isFull() || index > elementData.length) {
			// 如果当前数据已满,则根据指定的增量增加一个单位值
			Object[] tmp_ = new Object[elementData.length + increment];

			// 将原来的数据复制到临时数组中
			System.arraycopy(elementData, 0, tmp_, 0, elementData.length);
			this.elementData = tmp_;
		}
		
		System.arraycopy(elementData, index, elementData, index+1, size()-index);
		elementData[index] = item;

	}

	/**
	 * 移除指定的元素
	 * 
	 * @param item
	 *            待移除的元素
	 * @return 移除的元素
	 */
	public E remove(Object item) {
		// TODO Auto-generated method stub
		if (isEmpty())
			throw new NullPointerException();
		try {
			elementData[search(item)] = null;
		} catch (ArrayIndexOutOfBoundsException e) {
			throw new NullPointerException();
		}
		return remove(search(item));
	}

	/**
	 * 移除指定索引处的元素
	 * 
	 * @param index
	 *            移除元素的索引
	 * @return 移除的元素
	 */
	public E remove(int index) {
		if (isEmpty())
			throw new NullPointerException();
		
		E item = search(index);
		System.arraycopy(elementData, index + 1, elementData, index, size() - index);
		
		return item;
	}

	/**
	 * 移除ArrayList尾部元素
	 * 
	 * @return 移除的元素
	 */
	public E remove() {
		return remove(size() - 1);
	}

	/**
	 * 查找指定元素的索引
	 * 
	 * @param item
	 *            指定的元素
	 * @return 指定元素的索引
	 */
	public int search(Object item) {
		// TODO Auto-generated method stub
		if (isEmpty())
			return -1;
		for (int i = 0; i < elementData.length; i++) {
			// 遍历数组
			if (elementData[i].equals(item))
				return i;
		}
		return -1;
	}

	/**
	 * 查找指定索引处的元素
	 * 
	 * @param index
	 *            指定的索引
	 * @return 指定索引处的元素
	 */
	@SuppressWarnings("unchecked")
	public E search(int index) {
		if(index < 0 || index > size())
			throw new ArrayIndexOutOfBoundsException();
		return (E) elementData[index];
	}

	/**
	 * 判断ArrayList是否为空
	 * 
	 * @return 如果为空返回true,否则返回false
	 */
	public boolean isEmpty() {
		if(this.size() == 0)
			return true;
		return false;
	}

	/**
	 * 将ArrayList转换为数组
	 * 
	 * @return 转换后的数组
	 */
	@SuppressWarnings("unchecked")
	public E[] toArray() {
		Object temp = new Object[size()];
		System.arraycopy(elementData, 0, temp, 0, size());
		return (E[]) temp;
	}

	/**
	 * 获取ArrayList的元素个数
	 * 
	 * @return 元素的有效个数
	 */
	public int size() {
		for (int i = elementData.length - 1; i >= 0; i--) {
			if (elementData[i] != null)
				return i + 1;
		}
		return 0;
	}

	private boolean isFull() {
		// 判断ArrayList是否已满;如果true,则返回true;否则返回false
		if(this.size() < elementData.length)
			return false;
		return true;
	}

	public void clear() {
		// TODO Auto-generated method stub
		while(!isEmpty())
			this.elementData[size()-1] = null;
			
	}

}

专注成就未来!
分享到:
评论

相关推荐

    模拟arraylist底层实现

    在Java中,ArrayList是一种常用的集合类,提供了许多实用的方法来操作集合数据,而本文则尝试模拟ArrayList的底层实现,通过自定义集合实现类MyArrayList,来实现基本的集合操作。 模拟ArrayList的add方法 在...

    模拟java ArrayList Iterator

    模拟ArrayList的Iterator实现,我们需要创建一个内部类,实现Iterator接口。这个内部类需要维护一个指向ArrayList实际元素的指针,以便于在迭代过程中跟踪当前位置。以下是一个简单的模拟实现: ```java public ...

    用C语言模拟ArrayList

    在C语言中,ArrayList是一种常见的数据结构,它模拟了Java或.NET等高级语言中的动态数组。ArrayList提供了在数组中添加、删除和查找元素的便利操作,而无需预先知道数组的大小。下面,我们将深入探讨如何用C语言实现...

    JSP_使用_Session_ArrayList_实现购物车程序

    这一步骤通过遍历`ArrayList`并调用`Goods`类的`compareTo()`方法来实现。如果发现已存在的商品,则显示提示信息而不执行添加操作。 ### 代码解析 下面是一些关键代码片段的分析: ```java // Goods.java public ...

    07.【Scanner类、Random类、ArrayList类】.zip

    在游戏开发、模拟和测试等场景中,`Random类`有着广泛的应用。 最后,我们来了解`ArrayList类`。这是Java集合框架的一部分,属于`java.util`包,实现了`List`接口。`ArrayList`是一个动态数组,允许我们在任何位置...

    ArrayList集合工具类

    通过查看源代码,我们可以学习到如何在JavaScript环境中模拟ArrayList的行为,以及如何处理与Java中的ArrayList不同的问题,如线程安全和动态扩容等。 总的来说,ArrayList集合工具类是Java编程中的核心组件,它在...

    JavaScript 实现基础 ArrayList 功能

    在JavaScript中,ArrayList是一种常见的数据结构,它模拟了Java中的ArrayList功能,允许程序员进行动态数组操作。虽然JavaScript原生不支持ArrayList,但我们可以利用数组(Array)对象来实现类似的功能。下面将详细...

    JAVA 模拟队列的实现

    在Java中,可以使用ArrayList或LinkedList类来实现这两种方式。下面简述两种方法: - 数组实现:利用数组的索引,0号索引表示队头,最后一个索引表示队尾,通过调整索引实现队列操作。 - 链表实现:LinkedList类...

    Java中ArrayList类的用法.docx

    在JavaScript中,虽然没有内置的ArrayList类,但可以使用Array对象模拟类似的功能,因为Array在JavaScript中是动态的,可以随时添加、删除或修改元素。然而,JavaScript的Array不提供像ArrayList那样的线程同步功能...

    js 集合类实现 (HashMap, Set, ArrayList, etc.)

    JavaScript中没有直接的ArrayList实现,但我们可以使用`Array`作为替代。`Array`提供了丰富的操作方法,如`push`, `pop`, `shift`, `unshift`, `splice`等。例如: ```javascript let myList = []; myList.push(1);...

    ArrayList测试.

    ArrayList是.NET框架中System.Collections命名空间下的一个类,它是基于数组实现的动态列表。ArrayList提供了在集合中添加、删除、查找和访问元素的功能,适用于存储各种类型的数据。在这个ArrayList测试中,我们将...

    数组模仿ArrayList

    在Java编程语言中,ArrayList是集合框架中的一种重要数据结构,属于List接口的实现类。它内部基于动态数组实现,提供了灵活的增删改查功能,同时保持了元素的有序性。本篇将深入探讨如何使用数组来模仿ArrayList的...

    c# 数组与集合(ArrayList)游戏开发高级使用举例

    相比之下,ArrayList是C#中System.Collections命名空间下的一个类,它实现了IList接口,允许动态调整大小。ArrayList内部基于数组实现,但提供了更多的灵活性。当你不确定需要存储多少元素或者需要频繁添加、删除...

    ArrayList 深入理解底层

    ArrayList是Java集合框架中的一种重要实现,它是一个基于数组实现的动态列表。ArrayList在JDK 1.8中,其内部使用一个Object数组`elementData`来存储元素,因此它的性能受到数组操作的影响,比如添加、删除和查找。...

    模拟退火Java实现

    在这个Java实现中,模拟退火算法的核心思想是通过随机改变当前解决方案(即旅行路线),并根据温度和接受概率来决定是否接受这个新解。初始时,算法设置一个较高的温度,随着迭代进行,温度会逐渐降低,使得接受较差...

    PHP实现C#山寨ArrayList的方法

    本文将详细讲解如何在PHP中实现一个类,该类能够模拟C#中ArrayList的常见操作方法。 首先,我们要知道C#的ArrayList是一个基于数组的集合,它能够动态地存储任意类型的对象。ArrayList可以自动扩展以容纳更多元素,...

    Weather代码,模拟这个过程,生成天气数据,然后显示出来

    4、设计一个测试类WeatherTest,模拟生成和读取数据的过程,要求实现生成一次,紧接着进行读取,不能出现不同步的情况。 详细设计: 1、 天气类Weather,包含int类型的温度(temperature)和湿度(humidity)...

    Java模拟操作系统实验之四种进程调度算法实现(FCFS,SJF,RR,HRN)

    在进行上述算法实现时,Java的集合框架(如ArrayList、LinkedList)和数据结构(如堆、优先队列)将发挥重要作用。同时,需要注意的是,模拟过程中应考虑进程的创建、唤醒、阻塞和结束等状态转换,以及可能的进程...

    java模拟实现跑步比赛.rar

    在Java编程语言中,模拟实现一个跑步比赛是一个典型的对象导向编程问题,涉及到类的设计、对象的创建以及事件的处理。这个项目可能包括参赛者(Runner)类、比赛(Race)类以及比赛结果(Result)类等核心组件。下面...

    js实现ArrayList功能附实例代码

    总的来说,通过使用JavaScript来模拟ArrayList,我们可以更加深入地理解数据结构的工作原理,并在实际应用中灵活运用。学习如何实现这样的功能有助于提高编程能力,并为解决更复杂的问题打下坚实的基础。

Global site tag (gtag.js) - Google Analytics