Java 使用 数组实现 动态数组

前述

数组是各编程语言中最为基础的一个数据结构,在Java 语言中,平时使用也很多,同时,JDK 提供了 动态数组的实现,ArrayList,这里 我使用数组来实现一下动态数组,

参考实现

复制代码
import java.util.function.Consumer;

/**
 * 使用数组 实现动态数组 ArrayList
 */
public class DynamicArray<E> {
    // new ArrayList<String>()
    //1、声明数组
    private Object[] array;
    //默认大小
    private final int INITIAL_CAPACITY = 10;

    //构造器
    public DynamicArray() {
        this.array = new Object[INITIAL_CAPACITY];
    }

    //大小
    private int size;

    /**
     * 返回数组元素数
     *
     * @return
     */
    public int size() {
        return size;
    }

    /**
     * 是否为空
     *
     * @return
     */
    public Boolean isEmpty() {
        return size == 0;
    }

    /**
     * 中间添加元素
     *
     * @param index
     * @param element
     */
    public void add(int index, E element) {
        //判断索引是否合法
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(index);
        } else {
            //判断是否需要扩容
            if (size >= array.length) {
                //进行扩容
                grow();
            } else {
                //腾位置,指定位置写元素
                for (int i = size - 1; i >= index; i--) {
                    array[i + 1] = array[i];
                }
                array[index] = element;
            }
        }
        size++;
    }

    /**
     * 末尾添加元素
     *
     * @param element
     */
    public void add(E element) {
        this.add(size, element);
    }

    /**
     * 获取指定位置元素
     *
     * @param index
     * @return
     */
    public E get(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(index);
        } else {
            return (E) array[index];
        }
    }

    /**
     * 删除指定位置元素
     *
     * @param index 要删除的数据索引
     * @return 删除的数据
     */
    public E remove(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(index);
        } else {
            Object temp = array[index];
            for (int i = index + 1; i < size - 1; i++) {
                array[i - 1] = array[i];
            }
            size--;
            return (E) temp;
        }
    }

    /**
     * 重置指定位置元素
     *
     * @param index 索引
     * @param element 新数据
     * @return 旧数据
     */
    public E set(int index, E element) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(index);
        } else {
            Object e = array[index];
            array[index] = element;
            return (E) e;
        }
    }

    /**
     * 遍历
     *
     * @param consumer
     */
    public void forEache(Consumer<E> consumer) {
        for (int i = 0; i < size; i++) {
            consumer.accept((E) array[i]);
        }
    }

    /**
     * 扩容
     * for (int i = 0; i < array.length; i++) {
     * newArray[i] = array[i];
     * }
     * arraycopy 是 native 修饰的方法,底层可以使用 C 语言的 api 进行处理,效率更高
     *
     * @IntrinsicCandidate public static native void arraycopy(Object src,  int  srcPos,
     * Object dest, int destPos,
     * int length);
     */
    private void grow() {
        Object[] newArray = new Object[array.length * 2];
        System.arraycopy(array, 0, newArray, 0, array.length);
        array = newArray;
    }

    /**
     * 判断索引是否有效
     *
     * @param index 索引
     * @return true 有效
     */
    private boolean checkIndex(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException(index);
        } else {
            return true;
        }
    }

    /**
     * 格式化输出
     * @return
     */
    @Override
    public String toString() {
        if (isEmpty()) {
            return "[]";
        } else {
            StringBuilder builder = new StringBuilder();
            builder.append("[");
            forEache(item -> builder.append(item).append(","));
            builder.replace(builder.length() - 1, builder.length(), ",");
            return builder.toString();
        }
    }

    public static void main(String[] args) {
        DynamicArray<Integer> arr = new DynamicArray<>();
        for (int i = 0; i < 15; i++) {
            arr.add(i);
        }
        System.out.println(arr);
    }
}
复制代码

 

posted @   晓枫的春天  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示