• 重写一下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()时,需要调用耗时的依赖方法。

  • 相关阅读:
    IntelliJ IDEA 添加本地xsd文件
    Dubbox离线约束地址
    IDEA发布运行web项目(曾经遇到的项目启动报404)
    项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
    IDEA使用maven中tomcat插件来启动服务器配置
    NetCore实践篇:分布式监控客户端ZipkinTracer从入门到放弃之路
    .Net外包篇:我是怎么看待外包的(二)
    .Net外包篇:我是如何看待外包的
    .Net架构篇:思考如何设计一款实用的分布式监控系统?
    分布式Redis缓存串讲(一)
  • 原文地址:https://www.cnblogs.com/z-jx/p/10579353.html
Copyright © 2020-2023  润新知