实现一个类似ArrayList的数据结构

简介: 实现一个类似ArrayList的数据结构

实现一个类似ArrayList的数据结构,可以帮助我们更深入地理解动态数组的原理和实现细节。在Java中,ArrayList是常用的动态数组实现,它可以根据需要动态地增长或缩减存储元素的空间,提供了便捷的操作方法。

 

自实现ArrayList的核心原理

 

自实现一个ArrayList主要涉及以下几个核心原理和步骤:

 

1. **动态数组的基本结构**:使用数组作为基本的存储结构,并实现动态扩展功能。当数组容量不足时,通过创建一个更大的数组并将原有元素拷贝过去来实现扩展。

 

2. **元素的添加和删除**:实现添加元素、获取元素、删除元素等基本操作。添加元素时,需要考虑数组容量是否足够;删除元素时,可能需要进行数组的整理和缩减容量的操作。

 

3. **迭代器的实现**:提供迭代器以支持对ArrayList中元素的遍历和操作。

 

4. **异常处理**:处理可能的越界访问等异常情况。

 

自实现ArrayList的代码示例

 

下面是一个简单的自实现ArrayList的代码示例,展示了基本的添加、获取、删除和迭代功能。

 

```java
import java.util.Arrays;
import java.util.Iterator;
import java.util.NoSuchElementException;
 
public class MyArrayList<E> implements Iterable<E> {
    private static final int DEFAULT_CAPACITY = 10;
    private Object[] elements;
    private int size;
 
    public MyArrayList() {
        elements = new Object[DEFAULT_CAPACITY];
        size = 0;
    }
 
    public MyArrayList(int initialCapacity) {
        if (initialCapacity < 0) {
            throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
        }
        elements = new Object[initialCapacity];
        size = 0;
    }
 
    public int size() {
        return size;
    }
 
    public boolean isEmpty() {
        return size == 0;
    }
 
    public void add(E e) {
        if (size == elements.length) {
            ensureCapacity(size + 1);
        }
        elements[size++] = e;
    }
 
    @SuppressWarnings("unchecked")
    public E get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        return (E) elements[index];
    }
 
    public E remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
        }
        @SuppressWarnings("unchecked")
        E oldValue = (E) elements[index];
        int numMoved = size - index - 1;
        if (numMoved > 0) {
            System.arraycopy(elements, index + 1, elements, index, numMoved);
        }
        elements[--size] = null; // Let gc do its work
        return oldValue;
    }
 
    private void ensureCapacity(int minCapacity) {
        int oldCapacity = elements.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1); // grow by 50%
        if (newCapacity < minCapacity) {
            newCapacity = minCapacity;
        }
        elements = Arrays.copyOf(elements, newCapacity);
    }
 
    @Override
    public Iterator<E> iterator() {
        return new Iterator<E>() {
            private int cursor = 0;
 
            @Override
            public boolean hasNext() {
                return cursor != size;
            }
 
            @SuppressWarnings("unchecked")
            @Override
            public E next() {
                int i = cursor;
                if (i >= size) {
                    throw new NoSuchElementException();
                }
                cursor = i + 1;
                return (E) elements[i];
            }
        };
    }
 
    public static void main(String[] args) {
        MyArrayList<String> list = new MyArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");
 
        System.out.println("Elements in the list:");
        for (String fruit : list) {
            System.out.println(fruit);
        }
 
        System.out.println("Removing element at index 1: " + list.remove(1));
        System.out.println("Size of list after removal: " + list.size());
 
        System.out.println("Elements in the list after removal:");
        for (String fruit : list) {
            System.out.println(fruit);
        }
    }
}
```

 

解释和关键点说明

 

- **数组存储**:`elements`数组用于存储元素,初始化时默认容量为`DEFAULT_CAPACITY`(这里设定为10)。

- **添加元素**:`add(E e)`方法将元素添加到数组末尾,如果数组容量不足则通过`ensureCapacity`方法扩展数组。

- **获取元素**:`get(int index)`方法根据索引获取元素,注意边界检查。

- **删除元素**:`remove(int index)`方法删除指定索引位置的元素,将后续元素向前移动。

- **迭代器**:实现了`Iterable<E>`接口,使得可以使用增强的for循环和迭代器遍历列表中的元素。

- **动态扩展**:`ensureCapacity(int minCapacity)`方法负责数组容量的动态扩展,保证足够的存储空间。

 

这个示例演示了如何基于数组实现一个简单的动态数组,具备基本的添加、获取、删除和迭代功能。自实现ArrayList的过程不仅可以加深对数据结构的理解,还能够理解Java集合框架中ArrayList的设计原理和优化策略。

目录
相关文章
|
2月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
16天前
|
存储 Java 程序员
【数据结构】初识集合&深入剖析顺序表(Arraylist)
Java集合框架主要由接口、实现类及迭代器组成,包括Collection和Map两大类。Collection涵盖List(有序、可重复)、Set(无序、不可重复),Map则由键值对构成。集合通过接口定义基本操作,具体实现由各类如ArrayList、HashSet等提供。迭代器允许遍历集合而不暴露其实现细节。List系列集合元素有序且可重复,Set系列元素无序且不可重复。集合遍历可通过迭代器、增强for循环、普通for循环及Lambda表达式实现,各有适用场景。其中ArrayList实现了动态数组功能,可根据需求自动调整大小。
28 11
|
4月前
|
存储 Java API
Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
|
4月前
|
存储 Java 索引
【Java】LinkedList vs. ArrayList:Java中的数据结构选择
【Java】LinkedList vs. ArrayList:Java中的数据结构选择
23 3
|
5月前
|
存储 算法
【数据结构与算法 | 基础篇】模拟ArrayList实现的“动态数组“
【数据结构与算法 | 基础篇】模拟ArrayList实现的“动态数组“
|
5月前
|
存储 算法 Java
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)
164 0
|
5月前
|
存储 算法 Java
ArrayList vs. LinkedList:数据结构之争
ArrayList vs. LinkedList:数据结构之争
51 0
|
5月前
数据结构 模拟实现ArrayList顺序表
数据结构 模拟实现ArrayList顺序表
46 0
|
5月前
|
Java 索引
数据结构之ArrayList与顺序表(有源码剖析)(二)
数据结构之ArrayList与顺序表(有源码剖析)
61 0
|
3天前
|
算法 安全 测试技术
golang 栈数据结构的实现和应用
本文详细介绍了“栈”这一数据结构的特点,并用Golang实现栈。栈是一种FILO(First In Last Out,即先进后出或后进先出)的数据结构。文章展示了如何用slice和链表来实现栈,并通过golang benchmark测试了二者的性能差异。此外,还提供了几个使用栈结构解决的实际算法问题示例,如有效的括号匹配等。
golang 栈数据结构的实现和应用