Java ArrayList和CircularRayList之间的主要区别是什么

Java ArrayList和CircularRayList之间的主要区别是什么,java,arraylist,Java,Arraylist,我想在不使用任何Java API的情况下构建自己的CircularArray列表。但是我浏览过互联网,找不到和ArrayList和循环ArrayList的基本区别。我总是以循环队列的定义结束 这两种数据结构之间的基本区别是什么?我没有直接回答这个问题,但是,我提供了如何使用Java实现循环数组的代码 class CircularArray<T> implements Iterable<T> { private T[] items; private in

我想在不使用任何Java API的情况下构建自己的CircularArray列表。但是我浏览过互联网,找不到和ArrayList和循环ArrayList的基本区别。我总是以循环队列的定义结束


这两种数据结构之间的基本区别是什么?

我没有直接回答这个问题,但是,我提供了如何使用Java实现循环数组的代码

class CircularArray<T> implements Iterable<T> {


    private T[] items;
    private int head = 0;

    public CircularArray(int size) {    
        items = (T[]) new Object[size];
    }

    private int convert(int index) {

        if (index < 0) {
            index += items.length;
        }

        return (head + index) % items.length;
    }

    public void rotate(int shiftRight) {

        head = convert(shiftRight);
    }

    public T get(int i) {

        if (i < 0 || i >= items.length) {

            throw new java.lang.IndexOutOfBoundsException("Index " + i + " is out of bounds");
        }

        return items[convert(i)];
    }

    public void set(int i, T item) {
        items[convert(i)] = item;
    }

    public Iterator<T> iterator() {
        return new CircularArrayIterator<T>(this);
    }


    private class CircularArrayIterator<TI> implements Iterator<TI> {


        private int current = -1;
        private TI[] items;

        public CircularArrayIterator(CircularArray<TI> circularArray) {
            items = circularArray.items;
        }

        @Override
        public boolean hasNext() {
            return current < items.length - 1;
        }

        @Override
        public TI next() {
            current++;
            TI item = (TI) items[convert(current)];
            return item;
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException("Remove is not supported by CircularArray");
        }
    }
}

现在,任务将是使用此循环数组数据结构创建自定义的循环数组列表。但是,我不确定这在哪些情况下会有所帮助,因为我们无法像扩展阵列一样扩展阵列列表。

主要区别在于:

正确实现的数组列表有一个摊销的O1追加操作,但在前置

循环数组列表已摊销O1追加和前置操作

数组列表具有删除最后一个元素的O1操作

循环数组列表具有删除第一个和最后一个元素的O1操作

因此,显然,循环数组列表的用例是为了让您能够在列表的任意一端添加和删除元素。这通常是通过将逻辑列表索引值与数组的当前长度进行模映射来实现的;e、 g

    public E get(int i) {
        // bounds checks ...
        return array[(first + i) mod array.length];
    }
其他列表操作也会进行类似的计算。由于这会使操作稍微慢一点,因此在希望从开始和结束添加和删除的情况下,只会使用循环数组列表

我总是以循环队列的定义结束

这是因为这些想法非常相似。循环数组列表可以用作循环队列。它实际上是一个双端队列。。。排队


1-需要注意的是,只有当列表支持数组按数组大小的比例扩展时,才会发生摊销O1;e、 g.长度加倍。

什么是CircularAryList?如果不知道它应该做什么,为什么要构建它?ArrayList有一个开始,索引0和结束,索引大小为-1。而一个循环的raylist环绕着。例如,索引大小等于索引0。实际索引由索引%Size计算。请查看此参考: