美文网首页数据结构
顺序表:ArrayList的原理及实现

顺序表:ArrayList的原理及实现

作者: 浅谈码生活 | 来源:发表于2021-01-12 16:07 被阅读0次

顺序表在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元,依次存储线性表中的各个元素、使得线性表中再逻辑结构上响铃的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。

**线性表的特征:**
1.第一个数据元素没有前驱,这个数据元素被称为头结点。
2.最后一个数据元素没有后继,这个数据元素被称为尾结点。
3.除了第一个和最后一个数据元素外,其他数据元素有且仅有一个前驱和一个后继。

顺序表代码实现:

/// <summary>
/// 顺序表
/// </summary>
/// <typeparam name="T"></typeparam>
public class SequenceList<T> : IEnumerable
{
    //存储元素的数据
    private T[] eles;
    //记录当前顺序表中的元素个数
    private int N;   
    public SequenceList(int capacity)
    {
        this.eles = new T[capacity];
        this.N = 0;
    }

    public void Clear()
    {
        this.N = 0;
    }

    public bool IsEmpty()
    {
        return N == 0;
    }

    public int Length()
    {
        return N;
    }

    public T Get(int i)
    {
        return this.eles[i];
    }

    public void insert(T t)
    {
        this.eles[N++] = t;
    }

    public void insert(int i, T t)
    {
        for (int index = N; index > i; index--)
        {
            eles[index] = eles[index - 1];
        }
        eles[i] = t;
        N++;
    }

    public T Remove(int i)
    {
        T current = eles[i];
        for (int index = i; index < N - 1; index++)
        {
            eles[index] = eles[index - 1];
        }
        N--;
        return current;
    }

    public int indexOf(T t)
    {
        for (int i = 0; i < N; i++)
        {
            if (Object.ReferenceEquals(eles[i], t))
            {
                return i;
            }
        }
        return -1;
    }

    public IEnumerator GetEnumerator()
    {
        return new MyEnumerator(eles);
    }

    public class MyEnumerator : IEnumerator
    {

        T[] eles;
        int idx = -1;
        public MyEnumerator(T[] eles)
        {
            idx = 0;
            this.eles = eles;
        }
        public object Current
        {
            get
            {
                if (idx == -1)
                    return new IndexOutOfRangeException();
                return eles[idx];
            }
        }
        public bool MoveNext()
        {
            idx++;
            return eles.Length > idx;
        }
        public void Reset()
        {
            idx = -1;
        }
    }
}

总结:由于顺序表的底层由数组实现,数组的长度是固定的,所以在操作的过程中涉及到了容器扩容操作。这样会导致顺序表在使用过程中的时间复杂度不是线性的,在某些需要扩容的结点处,耗时会突增,尤其是元素越多,这个问题越明显。

相关文章

  • 顺序表:ArrayList的原理及实现

    顺序表在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元,依次存储线性表中的各个...

  • 数据结构(顺序表)的应用——ArrayList、Vector分析

    上篇我们提到了顺序表在平常开发中的应用,现在我们只重点分析ArrayList及Vector的实现。 ArrayLi...

  • ArrayList与LinkedList

    简介: ArrayList和LinkedList就是分别对顺序表和双向链表的一种实现 顺序表:需要申请连续的内存空...

  • 2018-08-08

    集合类的底层实现原理 1、ArrayList底层实现和原理 首先了解线性表、数组的概念。 线性表:最基本、最简单、...

  • java数据结构与算法之顺序表与链表深入分析

    一、线性表的顺序存储设计与实现(顺序表) 1.1 顺序存储结构的设计原理概要 顺序存储结构底层是利用数组来实现的,...

  • Java容器类快速入门

    List元素有放入顺序,元素可重复,主要实现包括ArrayList(基于数组的线性表)、LinkedList(双向...

  • ArrayList 2018-08-01

    ArrayList : 类图 RandomAccess:标记接口,表示支持快速访问,实现方式为顺序表,查询更快 C...

  • ArrayList实现原理(JDK1.8)

    ArrayList实现原理(JDK1.8) ArrayList 继承于AbstractList,实现了List接口...

  • 数据结构之顺序表

    Num01-->线性表定义及顺序表和链表 Num02-->顺序表的基本形式 Num03-->顺序表的结构与实现 T...

  • 数据结构之Java List

    本文从线性数据结构顺序表与链表开始分析Java中ArrayList与LinkedList的实现,最后对Java L...

网友评论

    本文标题:顺序表:ArrayList的原理及实现

    本文链接:https://www.haomeiwen.com/subject/sjheaktx.html