用java实现一个简单的ArrayList

本文介绍了一个简单的Java实现的ArrayList,包括定义、接口声明、具体实现及测试案例。该实现覆盖了基本操作如添加、获取、删除等,并通过JUnit进行了验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重复造轮子虽然不可取,但是温习一下数据结构,光看不做总是少了什么,所以也来实现一下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:4
remove后的数组size:3remove后的数组:
a,b,d,
insert后的数组:
a,b,d,gg,

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值