zoukankan      html  css  js  c++  java
  • 重写一下ArrayList

    其实重写不难,下面是我重写时定义的一些接口。
    /**
    
     * 重写实现一个list
    
     * @author <u>zhoujx</u>
    
     *
    
     */
    
    public interface MyList<E> {
    
    
    
           /**
    
            * 添加一个元素
    
            * @param element 元素
    
            */
    
           public void add(E element);
    
           
    
           /**
    
            * 添加一组元素
    
            * @param elements 一组元素
    
            */
    
           public void add(E[] elements);
    
           
    
           /**
    
            * 删除元素
    
            * @param element 需要删除的元素
    
            * @param allOccurence true就删除所有该元素,false则删除第一次出现的该元素
    
            * @return 元素存在返回true,不存在返回false
    
            */
    
           public boolean del(E element, boolean allOccurence);
    
           
    
           /**
    
            * 删除指定位置的元素
    
            * @param index 指定位置
    
            * @return 返回删除的元素
    
            */
    
           public E del(int index);
    
           
    
           /**
    
            * 删除指定位置的元素
    
            * @param index 指定位置
    
            * @return 返回删除的元素
    
            */
    
           public E del(E element);
    
           
    
           /**
    
            * 更换指定位置的元素
    
            * @param index 元素的位置也就是索引
    
            * @param element
    
            * @return 被更换的老元素
    
            */
    
           public E set(int index, E element);
    
           
    
           /**
    
            * 获取元素
    
            * @param index 元素位置(索引)
    
            * @return 元素
    
            */
    
           public E get(int index);
    
           
    
           /**
    
            * 查找元素首次出现的位置
    
            * @param element 需要查找的元素
    
            * @return 查找到则返回该元素位置,否则返回-1
    
            */
    
           public int indexOf(E element);
    
           
    
           /**
    
            * 使用指定位置获取当前容器的子容器
    
            * @param fromIndex 开始位置(包括)
    
            * @param toIndex 结束位置(不包括)
    
            * @return 子容器
    
            */
    
           public MyList<E> subList(int fromIndex, int toIndex);
    
           
    
           /**
    
            * 是否为空容器
    
            * @return 是返回true,不是返回false 
    
            */
    
           public boolean isEmpty();
    
           
    
           /**
    
            * 清空容器
    
            */
    
           public void clear();
    
           
    
           /**
    
            * 获取容器大小
    
            * @return 容器中元素的个数
    
            */
    
           public int size();
    
           
    
    }
    
    
    
    使用到的一些方法或者依赖

    我在删除使用到System的arraycopy()

    System.arraycopy(a, 0, elementData, size, numNew);的意思是将数组a中从下标0开始,到0+numNew=numNew之间的元素移动到elementData数组中,但存放的位置是在size之后的,这样说应该能懂这个方法是干什么的了,这个操作是比较花时间的,所以对于添加和删除操作比较的频繁的时候,LinkedList是要好于ArrayList的,所以平时不要一味的依赖ArrayList。

    扩容时使用了Arrays的copyOf()

    Arrays的copyOf()方法传回的数组是新的数组对象,所以您改变传回数组中的元素值,也不会影响原来的数组。copyOf()的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值

    从源码能看出arraylist的好处和坏处,其实不难。

    好处就是在调用get()以及set()方法时,因为是基于数组的,有了数组的特性很快。

    但是在add()和del()时,需要调用耗时的依赖方法。

  • 相关阅读:
    MySQL 之 Metadata Locking 研究
    Spring, MyBatis 多数据源的配置和管理
    ThreadLocal 源码剖析
    Java多线程中的死锁问题
    Java并发基础框架AbstractQueuedSynchronizer初探(ReentrantLock的实现分析)
    PriorityQueue和Queue的一种变体的实现
    被我们忽略的HttpSession线程安全问题
    Java并发之原子变量和原子引用与volatile
    使用Java实现单线程模式
    这些年无处安放的博客
  • 原文地址:https://www.cnblogs.com/z-jx/p/10579353.html
Copyright © 2011-2022 走看看