`
cq520
  • 浏览: 167090 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

自定义ArrayList的实现

阅读更多

使用数组来实现自定义ArrayList,除了基本的增删查改等方法之外,还添加了API中所使用到的一些方法,方便大家更好的理解ArrayList的实现,具体实现都有解释,主函数中给出了测试方法,代码如下:

/**
 * 自定义泛型列表
 * @author 陈强
 * @param <E>
 */
public class MyArrayList<E> {
	Object[] data=new Object[0];//初始数组,定义一个对象类型的数组保存数据
	public static void main(String args[]){
		//创建Integer类型的数组列表
		MyArrayList<Integer> my=new MyArrayList<Integer>();
		//添加元素
		for(int i=1;i<=5;i++){
			my.add(i);
		}
		//my.removeFromTo(1, 3);
		my.add(1);
		//my.turnArray();
		//System.out.println("首次出现指定元素的位置是"+my.IndexOf(1));
		System.out.println("最后一次出现指定元素的位置是"+my.LastIndexOf(1));
		System.out.println("队列当前的长度是"+my.size());
		my.print();
		//System.out.println("获取的元素"+my.get(1));
	}
	/**
	 * 打印队列元素的方法
	 */
	public void print(){
		int length=data.length;
		for(int i=0;i<length;i++){
			System.out.print(data[i]+" ");
		}
	}
	/**
	 *	添加元素的方法
	 * @param e
	 */
	public void add(E e){
		int length=data.length;//获取当前数组的长度
		Object[] dest=new Object[length+1];//创建一个新数组
		//先将原数组中的元素都复制过来
		for(int i=0;i<length;i++){
			dest[i]=data[i];
		}
		dest[length]=e;//添加新元素
		data=dest;//用新数组替换原来的数组
	}
	/**
	 * 插入元素的方法
	 * @param index 指定的下标
	 * @param e 插入的元素
	 */
	public void insert(int index,E e){
		int length=data.length;
		Object[] dest=new Object[length+1];
		for(int i=0;i<index;i++){//将索引前的元素先复制过来
			dest[i]=data[i];
		}
		dest[index]=e;//添加新元素到索引位置
		for(int j=index;j<length;j++){//再将后面一部分元素复制过来
			dest[j+1]=data[j];
		}
		data=dest;
	}
	/**
	 * 删除元素的方法
	 * @param index 指定的下标
	 */
	@SuppressWarnings("unchecked")
	public E remove(int index){
		int length=data.length;
		Object[] dest=new Object[length-1];
		for(int i=0;i<index;i++){//将索引前的元素复制过来
			dest[i]=data[i];
		}
		for(int j=index+1;j<length;j++){//跳过索引指定的位置
			dest[j-1]=data[j];
		}
		data=dest;
		return (E)data[index];//得到被移除的元素
	}
	/**
	 * 移除所有元素的方法
	 */
	public void removeAll(){
		Object dest[]=new Object[0];
		data=dest;
	}
	/**
	 * 获取队列的长度
	 */
	public int size(){
		return data.length;
	}
	/**
	 * 获取指定下标的元素
	 */
	@SuppressWarnings("unchecked")
	public E get(int index){
		return (E) data[index];
	}
	/**
	 * 判断队列是否为空
	 */
	public boolean isEmpty(){
		return size()==0;
	}
	/**
	 * 改变指定下标位置的元素的方法
	 * @param index
	 * @param e
	 */
	public void set(int index,E e){
		//方法类似插入的方法
		int length=data.length;
		Object[] dest=new Object[length];
		for(int i=0;i<index;i++){
			dest[i]=data[i];
		}
		dest[index]=e;//改变指定位置的元素
		for(int j=index+1;j<length;j++){
			dest[j]=data[j];
		}
		data=dest;
	}
	/**
	 * 删除从某一个下标位置开始到某一个下标位置结束的中间元素
	 * @param start 开始位置的下标
	 * @param end	结束位置的下标
	 */
	public void removeFromTo(int start,int end){
		int length=data.length;
		Object dest[]=new Object[length-(end-start)-1];
		for(int i=0;i<start;i++){
			dest[i]=data[i];
		}
		for(int j=end+1;j<length;j++){
			dest[j-(end-start)-1]=data[j];
		}
		data=dest;
	}
	/**
	 * 将列表翻转
	 */
	public void turnArray(){
		int length=data.length;
		int j=length-1;
		Object temp;
		for(int i=0;i<length/2;i++){
			temp=data[j];
			data[j]=data[i];
			data[i]=temp;
			j--;
		}
	}
	/**
	 * 搜索列表中首次出现指定元素的位置,如果不存在该元素则返回-1
	 * @param obj
	 */
	public int IndexOf(Object obj){
		int length=data.length;
		for(int i=0;i<length;i++){
			if(data[i]==obj){
				return i;
			}
		}
		return -1;
	}
	/**
	 * 搜索列表中最后一个出现指定元素的位置,如果不存在则返回-1
	 * @param obj 指定元素
	 */
	public int LastIndexOf(Object obj){
		int length=data.length;
		for(int i=length-1;i>=0;i--){
			if(data[i]==obj){
				return i;
			}
		}
		return -1;
	}
}

 

0
3
分享到:
评论
3 楼 lvwenwen 2013-05-05  
得多看看源码
2 楼 cq520 2013-05-04  
beautiful5200 写道
稍微看过JDK源码就知道,第7行代码是个败笔。这个败笔产生的后果在add方法中体现的淋漓尽致!初始容量不要为0,并且,数组扩容时按现有大小的一定倍数扩容,不是一个个扩容。

    很久以前写过的数据结构,那时还没学过API中的ArrayList,也没有看过JDK源码,所有的方法都是看方法名自己想出来的,只是当时还没写博客的习惯,多谢提醒,还是得多看看源码呀
1 楼 beautiful5200 2013-05-04  
稍微看过JDK源码就知道,第7行代码是个败笔。这个败笔产生的后果在add方法中体现的淋漓尽致!初始容量不要为0,并且,数组扩容时按现有大小的一定倍数扩容,不是一个个扩容。

相关推荐

    自定义ArrayList实现

    自己写的ArrayList,请勿喷!

    自定义实现的ArrayList

    自定义实现的ArrayList数据结构,有大量注释以及编写思路,帮助新手用Java语言来实现数据结构

    Java 中模仿源码自定义ArrayList

    在Java编程中,模仿源码自定义ArrayList是一个深入理解数据结构和Java集合框架的好方法。ArrayList作为Java集合框架的一部分,其内部实现基于动态数组。通过分析ArrayList的源码,我们可以学习到如何创建一个类似的...

    模拟arraylist底层实现

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

    我的ArrayList实现

    《我的ArrayList实现》这篇博客主要探讨了如何在Java中自定义一个类似ArrayList的数据结构,并深入理解ArrayList的工作原理。ArrayList是Java集合框架中的一个重要组件,它是一个动态数组,提供了高效的元素添加、...

    android arraylist 实现 listview

    总结来说,实现"android arraylist 实现 listview"需要掌握ArrayList的使用,自定义Adapter的设计,Activity间数据传递,以及ListView的交互功能扩展,包括ContextMenu、OptionsMenu和长按事件的处理。这不仅涉及到...

    Android编程实现使用Intent传输包含自定义类的ArrayList示例

    如果我们想要传输包含自定义类的 ArrayList,需要使用 Serializable 接口来实现对象的序列化和反序列化。 首先,我们需要创建一个实现了 Serializable 接口的自定义类,例如 Person 类: ```java package javastudy...

    Java基础复习笔记04数据结构-线性表

    #### 知识点四:自定义ArrayList实现 在给定的部分内容中,展示了一个简单的`MyArrayList`类的实现。这个类实现了`List`接口,并使用一个对象数组`objects`来存储元素。`MyArrayList`的构造函数初始化数组的大小为...

    ArrayList的一个C++类模板实现

    在这个ArrayList实现中,第一层散列可能是用来快速定位元素的位置,而第二层散列可能是为了处理散列冲突,确保每个元素都有一个唯一的索引。这种双层散列结构可以显著减少查找和插入的时间复杂度,使其接近O(1)。 ...

    Tema-customArrayList

    标题“Tema-customArrayList”暗示我们正在探讨一个与Java编程相关的自定义ArrayList实现。ArrayList是Java集合框架中的一种动态数组,允许我们存储和操作一系列对象。在这个特定的主题中,我们可能涉及如何创建一个...

    asp hashmap,arraylist实现

    标题中的“asp hashmap,arraylist实现”指的是在ASP(Active Server Pages)编程中使用HashMap和ArrayList这两种数据结构的具体应用。HashMap和ArrayList是.NET框架中常用的数据集合类,它们在处理和组织数据方面各...

    ArrayList动态删除 自定义Adapter (附源码)

    ArrayList动态删除与自定义Adapter是Android开发中的常见操作,它涉及到数据存储、用户界面更新以及适配器模式的运用。在Android中,ListView是展示大量数据的常用组件,而ArrayList作为Java集合框架的一部分,通常...

    expandablelistview自定义实现单选效果

    List&lt;String&gt; groupList = new ArrayList(); // 初始化一级标题 // 添加一级标题到groupList... CustomExpandableListAdapter adapter = new CustomExpandableListAdapter(this, groupList); ...

    Android 自定义view实现签到功能

    在Android应用开发中,自定义View是提升用户体验和实现复杂交互的重要手段。本文将深入探讨如何使用Android自定义View来实现签到功能。签到功能是许多应用中的常见元素,它通常包括日期选择、连续签到奖励等特性。...

    java代码-自己设计的ArrayList

    在阅读提供的"main.java"和"README.txt"文件时,可以找到更多关于这个自定义ArrayList实现的细节。main.java应该是程序的主入口点,用于测试自定义ArrayList的功能;而README.txt通常包含项目的简要介绍、使用说明或...

    Android高级应用源码-自定义View实现折线图.rar

    这个"Android高级应用源码-自定义View实现折线图.rar"压缩包提供了一个实例,展示了如何从头开始构建一个自定义的View来绘制折线图。下面我们将深入探讨这一主题,讲解如何在Android中实现自定义View以及如何绘制...

    Android图片滚动,加入自动播放功能,使用自定义属性实现,霸气十足demo

    本文将深入探讨如何使用自定义控件和自定义属性来实现这一功能,以`SlidingViewSwitcher`为例进行讲解。 首先,自定义控件是Android开发中的一个重要环节,它允许开发者根据特定需求扩展系统提供的基础组件。在本...

    自定义实现的LinkedList

    自定义实现的ArrayList数据结构,有大量注释以及编写思路,帮助新手用Java语言来实现数据结构

    Java实训之利用Arraylist实现学生管理系统

    在这个实训项目中,“Java实训之利用ArrayList实现学生管理系统”旨在帮助初学者掌握ArrayList的基本操作,并将其应用于实际的管理系统中。 首先,我们需要了解ArrayList的基本特性。ArrayList是一个动态数组,它...

    JavaScript 实现基础 ArrayList 功能

    虽然JavaScript原生不支持ArrayList,但我们可以利用数组(Array)对象来实现类似的功能。下面将详细介绍如何使用JavaScript来实现基础的ArrayList功能,并探讨在没有参数重载(overload)的情况下如何处理方法的...

Global site tag (gtag.js) - Google Analytics