• java手写的动态数组JimisunArray


    /**
     * @Author:jimisun
     * @Description:
     * @Date:Created in 22:10 2018-07-18
     * @Modified By:
     */
    public class JimisunArray<E> {
    
        private E[] data;
        private int size;
    
    
        /**
         * 构造函数,传入数组的容量capacity构造Array
         *
         * @param capacity
         */
        public JimisunArray(int capacity) {
            data = (E[]) new Object[capacity];
            size = 0;
        }
    
        /**
         * 构造函数,如果没有传入数组容量,默认数组初始值10
         */
        public JimisunArray() {
            this(10);
            size = 0;
        }
    
        /**
         * 获取数组的元素个数
         *
         * @return
         */
        public int getSize() {
            return size;
        }
    
        /**
         * 获取数组的容量
         *
         * @return 数组的容量
         */
        public int getCapacity() {
            return data.length;
        }
    
        /**
         * 返回数组是否为null
         *
         * @return
         */
        public Boolean isEmpty() {
            return size == 0;
        }
    
        /**
         * 向所有元素后添加一个新的元素
         *
         * @param e
         */
        public void addLast(E e) {
            add(size, e);
        }
    
        /**
         * 向数组的头部添加一个新元素e
         *
         * @param e
         */
        public void addFirst(E e) {
            add(0, e);
        }
    
        /**
         * 向指定索引添加元素
         *
         * @param index
         * @param e
         */
        public void add(int index, E e) {
    
            if (index < 0 || index > size) {
                throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size.");
            }
    
            if (size == data.length) {
                resize(2 * data.length);
            }
    
            for (int i = size - 1; i >= index; i--) {
                data[i + 1] = data[i];
            }
            data[index] = e;
            size++;
        }
    
        /**
         * 扩充数组长度
         *
         * @param newCapacity
         */
        private void resize(int newCapacity) {
            E[] newData = (E[]) new Object[newCapacity];
            for (int i = 0; i < size; i++) {
                newData[i] = data[i];
            }
            data = newData;
        }
    
    
        /**
         * 从数组中删除index位置的元素,返回删除的元素
         *
         * @param index
         */
        public E remove(int index) {
            if (index < 0 || index >= size) {
                throw new IllegalArgumentException("Delete failed,Array is full, require index>0 && index<size");
            }
            E ret = data[index];
            for (int i = index + 1; i < size; i++) {
                data[i - 1] = data[i];
            }
            size--;
            //将最后一个变量设置为null,而并不是留着,垃圾回收机制无法回收,如果重新添加一个变量就会使原来的引用解除关联,很快就会垃圾回收
            data[size] = null;
    
            //进行数组的懒减弱,防止算法震荡,增加算法的复杂度
            if (size == data.length / 4 && data.length / 2 != 0) {
                resize(data.length / 2);
            }
    
            return ret;
        }
    
        /**
         * 删除第一个元素
         *
         * @return
         */
        public E removeFirst() {
            return remove(0);
        }
    
        /**
         * 删除最后一个元素
         *
         * @return
         */
        public E removeLast() {
            return remove(size - 1);
        }
    
        /**
         * 从数组中删除元素e
         *
         * @param e
         */
        public boolean removeElement(E e) {
            int index = find(e);
            if (index != -1) {
                remove(index);
                return true;
            }
            return false;
        }
    
        /**
         * 删除数组中所有的元素e
         * @param e
         */
        public void removeAllElement(E e) {
            while (removeElement(e) == true) {
                removeElement(e);
            }
        }
    
        /**
         * 获取指定索引的值
         *
         * @param index
         * @return
         */
        public E get(int index) {
            if (index < 0 || index >= size) {
                throw new IllegalArgumentException("get failed ,index is illagel.");
            }
            return data[index];
        }
    
        /**
         * 修改指定位置索引的值
         *
         * @param index
         * @param e
         */
        public void set(int index, E e) {
            if (index < 0 || index >= size) {
                throw new IllegalArgumentException("get failed ,index is illagel.");
            }
            data[index] = e;
        }
    
        /**
         * 查找数组中是否有元素e
         *
         * @param e
         * @return
         */
        public boolean contains(int e) {
            for (int i = 0; i < size; i++) {
                if (data[i].equals(e)) {
                    return true;
                }
            }
            return false;
        }
    
        /**
         * 查找数组中元素e所在的索引,如果不存在则返回-1
         *
         * @param e
         * @return
         */
        public int find(E e) {
            for (int i = 0; i < size; i++) {
                if (data[i].equals(e)) {
                    return i;
                }
            }
            return -1;
        }
    
    
        @Override
        public String toString() {
            StringBuilder res = new StringBuilder();
            res.append(String.format("Array:size = %d,capacity=%d
    ", size, data.length));
            res.append("[");
            for (int i = 0; i < size; i++) {
                res.append(data[i]);
                if (i != size - 1) {
                    res.append(",");
                }
            }
            res.append("]");
            return res.toString();
        }
    
    
        /**
         * 主方法测试
         *
         * @param args
         */
        public static void main(String[] args) {
            JimisunArray<Integer> array = new JimisunArray(10);
            for (int i = 0; i < 10; i++) {
                array.addLast(i);
            }
            for (int i = 0; i < 5; i++) {
                array.removeFirst();
            }
            System.out.print(array.toString());
        }
    
    
    }
  • 相关阅读:
    Java之CyclicBarrier使用
    HashMap,LinkedHashMap,TreeMap的区别
    阿里巴巴常考面试题及汇总答案
    HashTable, HashMap,TreeMap区别
    Java集合类详解
    java代码的几个utils,基本可以直接用
    adb控制手机屏幕滑动(批处理)
    在设备上启用 adb 调试,有一个小秘密
    python clickZan
    python控制鼠标键盘
  • 原文地址:https://www.cnblogs.com/jimisun/p/9426288.html
Copyright © 2020-2023  润新知