数据结构之线性顺序表ArrayList(Java实现)

一、ListMe接口:

import java.util.ArrayList;

//实现线性表(顺序表和链表)的接口:
//提供add get isEmpty size 功能
public interface ListMe<E> {
    //返回线性表大小:线性表元素个数,非底层数组长度
    public int size();

    //添加元素,追加在线性表最后
    public void add(E e);

    //(方法重载)添加元素,追加在线性表的index下标位置(插入)
    public void add(E e, int index);

    //返回线性表index位置的元素
    public E get(int index);

    //判断线性表是否为空;(非数组长度而是线性表元素个数是否为0)
    public boolean isEmpty();

    //窥视底层数组长度变化
    public void getElementData();
}

二、ArrayLisMe实现:

import java.util.Arrays;

//线性顺序表的实现
public class ArrayListMe<E> implements ListMe<E>{
    //创建存储线性表的数组
     E[] elementData;

    //创建线性顺序表的大小(元素个数初始化)
    private int size;

    //空参构造器,调用下面的构造器,默认设置5个初始化数组长度
    public ArrayListMe(){
        this(5);
    }

    //在构造器中创建数组对象,并根据给定值分配初始空间
    public ArrayListMe(int length) {
        this.elementData=(E[])new Object[length];
    }

    @Override
    public int size() {
        //返回元素个数
        return size;
    }
    //动态更新线性表储存容量,即底层数组大小(增加原来数组长度的一半大小)
    public void grow(){
        if(size==elementData.length)
            elementData=Arrays.copyOf(elementData,elementData.length+(elementData.length>>1));
    }
    @Override
    public void add(E e) {
        //判断是否需要动态增加长度
        grow();
        //添加在顺序线性表最后面
        elementData[size++]=e;
    }

    @Override
    public void add(E e, int index) {
        //判断是否需要动态增加长度
        grow();

        //移动元素
        for(int i=size;i>index;i--){
            elementData[i]=elementData[i-1];
        }

        //添加元素
        elementData[index]=e;
    }

    //判断是否指定index位置会造成下标越界(抛异常)
    public void indexException(int index){
        if(index<0 || index>=size)
            throw new RuntimeException("顺序表越界");
    }

    @Override
    public E get(int index) {

        indexException(index);

        return elementData[index];
    }

    @Override
    public boolean isEmpty() {
        //判断线性顺序表是否为空(无元素)
        return size==0;
    }

    //显示线性顺序表所有元素
    @Override
    public String toString() {
        StringBuilder sb=new StringBuilder("[");

        for(int i=0;i<size;i++){
            if(i!=size-1)
                sb.append(elementData[i]+",");
            else
                sb.append(elementData[i]+"]");
        }
        return sb.toString();
    }

    public void getElementData(){
        //窥视底层数组长度变化
        System.out.println("底层数组长度:"+elementData.length);
    }
}

三、测试类:

public class TestArrayListMe {
    //测试
    public static void main(String s[]){
        ListMe<Integer> listMe=new ArrayListMe<Integer>();

        System.out.println(listMe.isEmpty());

        listMe.add(0);
        listMe.add(1);
        listMe.add(2);
        listMe.add(3);
        listMe.add(4);

        System.out.println(listMe.isEmpty());

        listMe.get(4);

        System.out.println("顺序表元素个数:"+listMe.size());

        listMe.getElementData();

        System.out.println(listMe.toString());

//        listMe.get(5);

        listMe.add(5);

        System.out.println("顺序表元素个数:"+listMe.size());

        listMe.getElementData();

    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值