用java实现一个简单的ArrayList

来源:互联网 发布:做奥数题的软件 编辑:程序博客网 时间:2024/05/29 10:35

重复造轮子虽然不可取,但是温习一下数据结构,光看不做总是少了什么,所以也来实现一下List,希望多多包涵。

既然要实现一个List,先来简单说一下List的定义

线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了哨位结点)。我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构

以上为百度百科的定义。我们这次实现的是顺序存储结构的线性表。按照顺序读取和存储。

1.首先用接口把线性表需要实现的操作声明。为了图省事,其他的常用操作未进行定义,可以自己去实现。所有的add,remove等操作都没有进行boolean值的返还。

public interface CetrinwList<E> {    /**     * 取得数据     */    E get(int index);    /**     * 新增数据     */    void add(E e);    /**     * 移除数据     */    void remove(int index);    /**     * 插入数据     */    void insert(int index,E e);    /**     * 是否存在数据     * @return     */    boolean contains(Object o);    /**     * 获得List长度     * @return     */    int size();    /**     * 是否为空     * @return     */    boolean isEmpty();    /**     * 清空     */    void clearList();}

2.实现定义好的接口。

public class CetrinwArrayList<E> implements CetrinwList<E>{    /**     * 数组默认长度     */    private static final int DEFAULT_SIZE = 10;    /**     * 存储队列中的元素     */    private Object[] elements = null;    /**     *数组大小指针     */    private int capacity;    /**     * 当前游标     */    private int current;    public CetrinwArrayList(){        this(DEFAULT_SIZE);    }    public CetrinwArrayList(int size){        if(size < 0){            throw new RuntimeException("数组大小不能小于0");        }else{            this.elements = new Object[size];            this.current = 0;            capacity = size;        }    }    public E get(int index) {        confirmIndex(index);        return (E) this.elements[index];    }    public void add(E e) {        confirmSize();        this.elements[current] = e;        this.current++;    }    public void remove(int index) {        confirmIndex(index);        for (int i = index; i < elements.length; i++) {            if(i + 1 < elements.length){                elements[i] = elements[i+1];            }        }        current--;    }    public void insert(int index,E e) {        confirmIndex(index);        for (int i = 0; i < elements.length; i++) {            if(i >= index && i+2 < elements.length){                elements[i] = e;                elements[i+1] = elements[i+2];            }        }        current++;    }    public boolean contains(Object o) {        for (Object element : this.elements) {            if(o.equals(element)){                return true;            }        }        return false;    }    public int size() {        return this.current;    }    public boolean isEmpty() {        if(this.current >0){            return true;        }        return false;    }    public void clearList() {        elements = new Object[DEFAULT_SIZE];    }    /**     * 确认当前数组的容量,如果满足,则不操作,如果不满足,则增加空间     */    private void confirmSize(){        if(this.current == this.capacity){            this.capacity = this.capacity + this.DEFAULT_SIZE;            Object[] newElemets = new Object[this.capacity];            for (int i = 0; i < this.elements.length; i++) {                newElemets[i] = this.elements[i];            }            this.elements = newElemets;        }    }    /**     * 判断下标是否越界     */    private void confirmIndex(int index){        if(index > capacity || index < 0){            throw new RuntimeException("下标越界");        }    }}

3.Junit的测试类

@Test    public void cetrinWArrayListTest(){        CetrinwList<String> list = new CetrinwArrayList<String>();        list.add("a");        list.add("b");        list.add("c");        list.add("d");        System.out.println("下标为3的元素为"+list.get(3));        System.out.println("数组size:"+list.size());        list.remove(2);        System.out.print("remove后的数组size:"+list.size());        System.out.println("remove后的数组:");        for (int i = 0; i < list.size() ; i++) {            System.out.print(list.get(i)+",");        }        list.insert(3,"gg");        System.out.println("");        System.out.println("insert后的数组:");        for (int i = 0; i < list.size() ; i++) {            System.out.print(list.get(i)+",");        }    }

4.运行结果

下标为3的元素为d数组size:4remove后的数组size:3remove后的数组:a,b,d,insert后的数组:a,b,d,gg,

以上就是java实现的一个简单的ArrayList。

1 0