【数据结构与算法 | 基础篇】模拟ArrayList实现的“动态数组“

简介: 【数据结构与算法 | 基础篇】模拟ArrayList实现的“动态数组“

1.前言

我们将ArrayList视作动态数组,但其底层依然通过Object[]数组实现,我这里没有用到泛型,当做存储整形的动态数组.

我实现了增删查改操作,迭代器,及计算数组的长度等函数.

2.动态数组的代码实现

public class SimulateArrayTest implements Iterable<Integer>{
    //数组
    private static int[] elementDate;
    //数组实际存储数据的个数.
    private static int size = 0;
    //数组的容量
    private static int capacity = 10;
 
    public SimulateArrayTest() {
        elementDate = null;
    }
    public void add(int value) {
        if (size == 0) {
            elementDate = new int[capacity];
        }
        //存储数组的个数大于等于了数组的容量
        //则需要进行扩容操作
        if (size > capacity) {
            Dilatation();
        }
        elementDate[size++] = value;
    }
    //数组扩容操作
    public static void Dilatation() {
        int newCapacity = capacity + capacity >> 1;
        int[] newElementData = new int[newCapacity];
        System.arraycopy(elementDate, 0, newElementData, 0, size);
        capacity = newCapacity;
    }
    //查取操作
    public Integer get(int index) {
        if (index <= size - 1){
            return elementDate[index];
        }
        throw new RuntimeException();
    }
    //改数据的操作
    public void get(int index, int value) {
        if (index >= 0 && index <= size - 1) {
            elementDate[index] = value;
        }
        throw new RuntimeException();
    }
    //删除操作, 两个重载的remove方法
    public int remove(int index) {
        if (size > 0 && index >= 0 && index <= size - 1) {
            //删除的元素不是数组的末尾的元素, 我们就要把后面的数组赋值贴过来
            if (index < size - 1){
                //System.arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);
                //可以用于复制数组, 从src的srcPos位置开始复制到dest的destPos开始的位置上, 复制元素的长度为length;
                System.arraycopy(elementDate, index + 1 , elementDate, index, size - index - 1);
            }
            int temp =  elementDate[index];
            size--;
            return temp;
        }
        throw new RuntimeException();
    }
    public void remove(Integer value) {
        for (int i = 0; i < size; i++) {
            if (elementDate[i] == value) {
                if (i < size - 1) {
                    System.arraycopy(elementDate, i + 1 , elementDate, i, size - i - 1);
                }
                size--;
            }
        }
    }
    //获取数组的长度
    public int length() {
        return size;
    }
    public static int count = 0;
 
    //遍历, 迭代器
    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            @Override
            public boolean hasNext() {
                if (count < size) {
                    return true;
                }
                count = 0;
                return false;
            }
 
            @Override
            public Integer next() {
                return elementDate[count++];
            }
        };
    }
    public static void Traverse(Consumer<Integer> consumer) {
        for (int i = 0; i < size; i++) {
            consumer.accept(elementDate[i]);
        }
    }
}

我们可以向动态数组中添加元素,并遍历.

@Test
    public void test() {
        SimulateArrayTest s = new SimulateArrayTest();
        s.add(12);
        s.add(23);
        s.add(34);
        s.add(45);
        s.add(56);
        s.add(67);
        s.Traverse(value -> {
            System.out.println(value);
        });
    }
 
控制台 : 
12
23
34
45
56
67
相关文章
|
3月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
14天前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
1月前
|
Java C++ 索引
让星星⭐月亮告诉你,LinkedList和ArrayList底层数据结构及方法源码说明
`LinkedList` 和 `ArrayList` 是 Java 中两种常见的列表实现。`LinkedList` 基于双向链表,适合频繁的插入和删除操作,但按索引访问元素效率较低。`ArrayList` 基于动态数组,支持快速随机访问,但在中间位置插入或删除元素时性能较差。两者均实现了 `List` 接口,`LinkedList` 还额外实现了 `Deque` 接口,提供了更多队列操作。
23 3
|
1月前
|
存储 缓存 索引
从底层数据结构和CPU缓存两方面剖析LinkedList的查询效率为什么比ArrayList低
本文详细对比了ArrayList和LinkedList的查询效率,从底层数据结构和CPU缓存两个方面进行分析。ArrayList基于动态数组,支持随机访问,查询时间复杂度为O(1),且CPU缓存对其友好;而LinkedList基于双向链表,需要逐个节点遍历,查询时间复杂度为O(n),且CPU缓存对其帮助不大。文章还探讨了CPU缓存对数组增删操作的影响,指出缓存主要作用于读取而非修改。通过这些分析,加深了对这两种数据结构的理解。
35 2
|
1月前
|
设计模式 安全 容器
数据结构第一篇【探究List和ArrayList之间的奥秘 】
数据结构第一篇【探究List和ArrayList之间的奥秘 】
23 5
|
2月前
|
存储 Java 程序员
【数据结构】初识集合&深入剖析顺序表(Arraylist)
Java集合框架主要由接口、实现类及迭代器组成,包括Collection和Map两大类。Collection涵盖List(有序、可重复)、Set(无序、不可重复),Map则由键值对构成。集合通过接口定义基本操作,具体实现由各类如ArrayList、HashSet等提供。迭代器允许遍历集合而不暴露其实现细节。List系列集合元素有序且可重复,Set系列元素无序且不可重复。集合遍历可通过迭代器、增强for循环、普通for循环及Lambda表达式实现,各有适用场景。其中ArrayList实现了动态数组功能,可根据需求自动调整大小。
37 11
|
1月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
19 0
|
5月前
|
存储 Java API
Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
|
5月前
|
存储 Java 索引
实现一个类似ArrayList的数据结构
实现一个类似ArrayList的数据结构
44 4
|
5月前
|
存储 Java 索引
【Java】LinkedList vs. ArrayList:Java中的数据结构选择
【Java】LinkedList vs. ArrayList:Java中的数据结构选择
29 3