zoukankan      html  css  js  c++  java
  • Collection容器家族(读完ArrayList源码---小测试:自定义具有ArrayList各项功能的实现类)

            前面的几篇文章对ArrayList的超类和本身以及接口进行了讲解,为了更加深入理解ArrayList集合使用数组存储数据的思想,特意实现了一个自定义的MyArrayList,源码如下:

    /**
     * 自定义ArrayList集合
     * @param <E>
     */
    public class MyArrayList<E> implements Iterable<E>{
        // 设置默认容量为10
        private static final int DEFAULT_CAPACITY = 10;
        // 默认数组
        private static final Object[] DEFAULT_EMPTY_ELEMENTDATA = {};
        // 数组的长度
        private int size;
        // 保存数据的数组
        private Object[] elementData;
    
    
        // 构造方法
        public MyArrayList() {
            this.elementData = DEFAULT_EMPTY_ELEMENTDATA;
        }
    
        // 可知调用,指定集合大小
        private void ensureCapacity(int minCapacity) {
            int minExpand = this.elementData != DEFAULT_EMPTY_ELEMENTDATA ? 0 : DEFAULT_CAPACITY;
    
            if (minCapacity > minExpand) {
                ensureExplicitCapacity(minCapacity);
            }
        }
    
        // 判断minCapacity大小
        private void ensureCapacityInternal(int minCapacity) {
            ensureExplicitCapacity(calculateCapacity(minCapacity));
        }
    
        // 计算扩充容量的大小
        private int calculateCapacity(int minCapacity) {
            if (this.elementData == DEFAULT_EMPTY_ELEMENTDATA) {
                return Math.max(minCapacity, DEFAULT_CAPACITY);
            }
            return minCapacity;
        }
    
        private void ensureExplicitCapacity(int minCapacity) {
            if (minCapacity > this.elementData.length) {
                grow(minCapacity);
            }
        }
    
        private void grow(int minCapacity) {
            int oldCapacity = this.elementData.length;
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if (newCapacity < minCapacity) {
                newCapacity = minCapacity;
            }
            if (newCapacity > Integer.MAX_VALUE - 8) {
                newCapacity = Integer.MAX_VALUE;
            }
            this.elementData = Arrays.copyOf(this.elementData, newCapacity);
        }
    
        public int size() {
            return this.size;
        }
    
        public int getLength() {
            return this.elementData.length;
        }
    
        public boolean isEmpty() {
            return size() == 0;
        }
    
        // 添加元素
        public boolean add(E element) {
            ensureCapacityInternal(this.size + 1);
            this.elementData[this.size++] = element;
            return true;
        }
    
        // 在指定位置添加
        public void add(int index, E element) {
            ensureCapacityInternal(this.size + 1);
            System.arraycopy(this.elementData, index, this.elementData, index + 1, size - index);
            this.elementData[index] = element;
            size++;
        }
    
        // 清空所有数据
        public void clear() {
            for (int i = 0; i < this.size; i++) {
                this.elementData[i] = null;
            }
    
            this.size = 0;
        }
    
        // 删除第一次出现的指定元素
        public boolean remove(Object element) {
            if (element == null) {
                for (int index = 0; index < this.size; index++) {
                    if (this.elementData[index] == null) {
                        remove(index);
                        return true;
                    }
                }
            } else {
                for (int index = 0; index < this.size; index++) {
                    if (this.elementData[index].equals(element)) {
                        remove(index);
                        return true;
                    }
                }
            }
    
            return false;
        }
    
        // 删除指定索引的元素
        public E remove(int index) {
            E oldValue = (E)this.elementData[index];
            int moveElementNum = this.size - 1 - index;
            if (moveElementNum > 0) {
                System.arraycopy(this.elementData, index + 1, this.elementData, index, moveElementNum);
            }
            this.elementData[--this.size] = null;
    
            return oldValue;
        }
    
        // 替换指定索引处的元素
        public E set(int index, E element) {
            E oldValue = (E)this.elementData[index];
            this.elementData[index] = element;
            return oldValue;
        }
    
        public E get(int index) {
            return (E)this.elementData[index];
        }
    
        @Override
        public String toString() {
            return Arrays.toString(this.elementData);
        }
    
        @Override
        public Iterator<E> iterator() {
            return new Itr();
        }
    
        private class Itr implements Iterator<E> {
            // 数据指针
            int cursor;
            // 保存指针上次位置
            int lastRet = -1;
    
            @Override
            public boolean hasNext() {
                return cursor != size;
            }
    
            @Override
            public E next() {
                if (cursor >= size) {
                    new Exception("没有元素");
                }
                if (cursor >= elementData.length) {
                    new Exception("数组索引越界");
                }
    
                lastRet = cursor;
                return (E)elementData[cursor++];
            }
    
            @Override
            public void remove() {
                MyArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
            }
        }
    }
  • 相关阅读:
    gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性
    线性表的顺序存储实现
    汉诺塔问题, 用递归方法求集合中的中位数
    共用体union
    洛谷3384:【模板】树链剖分——题解
    BZOJ4196:[NOI2015]软件包管理器——题解
    BZOJ3140:[HNOI2013]消毒——题解
    BZOJ1059:[ZJOI2007]矩阵游戏——题解
    洛谷4277:萃香的请柬——题解
    BZOJ1854:[SCOI2010]连续攻击游戏——题解
  • 原文地址:https://www.cnblogs.com/IdealSpring/p/11871205.html
Copyright © 2011-2022 走看看