浅谈自定义ArrayList的实现

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

Java代码

/**
 * 自定义泛型列表
 * @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;
    }
}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, arraylist
, object
, 方法
, 代码
, 类型
自定义类型数组
arraylist自定义排序、java 自定义arraylist、自定义arraylist、arraylist 自定义类、arraylist实现原理,以便于您获取更多的相关知识。

时间: 2024-12-02 17:18:09

浅谈自定义ArrayList的实现的相关文章

浅谈Java自定义注解和运行时靠反射获取注解_java

java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能. 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annotation 包中. 1.元注解 元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1.1.@Retention: 定义注解的保留策略 @Retention(RetentionPolicy.SOURCE) //注解仅

浅谈Excel开发(七) Excel的自定义任务窗体

相关文章: 浅谈Excel开发(1) Excel开发概述 浅谈Excel开发(二) Excel 菜单系统 浅谈Excel开发(三) Excel 对象模型 前面花了三篇文章讲解了Excel中的UDF函数,RTD函数和异步UDF函数,这些都是Excel开发中的重中之重.本文现在开始接着第二篇文章的菜单系统开始讲解Excel中可供开发的界面元素,本文要讲解的是Excel中的自定义任务面板(Custome Task Panel,CTP) . 自定义任务面板在Office 2003中就引入了,相信大家都用

浅谈Excel开发(六) Excel的异步自定义函数

相关文章: 浅谈Excel开发(1) Excel开发概述 浅谈Excel开发(二) Excel 菜单系统 浅谈Excel开发(三) Excel 对象模型 上文介绍了Excel中的自定义函数(UDF ),它极大地扩展了Excel插件的功能,使得我们可以将业务逻 辑以Excel函数的形式表示,并可以根据这些细粒度的自定义函数,构建各种复杂的分析报表. 普通的UDF自定义函数的基本执行逻辑是,Excel接受用户输入的函数表达式,然后通过UDF函数的处理 逻辑进行处理,在处理过程中,Excel 的UI界

浅谈Excel开发(四) Excel自定义函数

相关文章: 浅谈Excel开发(1) Excel开发概述 浅谈Excel开发(二) Excel 菜单系统 浅谈Excel开发(三) Excel 对象模型 我们知道,Excel中有很多内置的函数,比如求和,求平均,字符串操作函数,金融函数等等.在有些 时候,结合业务要求,这些函数可能不能满足我们的需求,比如我想要一个函数能够从WebService上获取 某只股票的最新价:我想要一个函数能够获取当前的天气情况,这些需求我们可以通过编写Excel自定义 函数(User Define Function

浅谈Arrays.asList() 和ArrayList类型区别_java

<pre name="code" class="html"><pre name="code" class="html">Arrays.asList() 将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是Arrays类的静态内部类!用这个对象对列表进行添加删除更新操作,就会报UnsupportedO

浅谈javascript中自定义模版_javascript技巧

/** * Created by Administrator on 15-1-19. */ function functionUtil() { } functionUtil = { //某个DOM节点是否有某个属性 hasAttr: function (el, name) { var attr = el.getAttributeNode && el.getAttributeNode(name); return attr ? attr.specified : false }, //根据cla

浅谈fastjson的常用使用方法_java

如下所示: package Demo; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Vector; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; imp

浅谈对象数组或list排序及Collections排序原理_java

常需要对list进行排序,小到List<String>,大到对自定义的类进行排序.不需要自行归并或堆排序.简单实现一个接口即可. 本文先会介绍利用Collections对List<String>进行排序,继而讲到Collections.sort的原理, 再讲到如何对自定义类进行排序, 最后会介绍利用Collections sort对自定义对象进行排序的另外一种方法,并将两种排序进行了简单的性能比较. 1.对List<String>排序及Collections.sort的

浅谈Java中常用数据结构的实现类 Collection和Map_java

线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口 Collection是最基本的集合接口,一个C