其实重写不难,下面是我重写时定义的一些接口。
/**

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

重写一下ArrayList的更多相关文章

  1. 从Python学习中得到的一点启发 - Java逆向索引ArrayList

    看了几天Python,感觉记忆力不行了,很多东西记不住了.但是终归是得到了一点知识:重写一个ArrayList,允许从负值的索引得到指定的项.然后写一个得到斐波拉契数组的方法,这种方法要比递归调用的方 ...

  2. Java之集合(三)ArrayList

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7291339.html 1.前言 本章介绍List中最常用的一个类--ArrayList.在第一章中已经介绍了Li ...

  3. java 集合之Arraylist的遍历及排序

    最近培训是先学习java基础 从最基本的开始学起 因为今天刚刚开博客 要把上周的一些重点内容归纳一下 1.Arraylist常用遍历以及排序 import java.util.ArrayList; i ...

  4. Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  5. 201521123098 《Java程序设计》 第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 1. 对接口这一定义有了初步的了解: 2. 学习了如何定义实现类和如何实现一些接 ...

  6. Java编程手冊-Collection框架(上)

    该文章所讲内容基本涵盖了Collection里面的全部东西,尽管基于jdk 1.5的.可是思路非常清晰 1.引言 1.1 Collection框架的介绍 尽管我们能够使用数组去存储具有同样类型的元素集 ...

  7. [转载]Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  8. 2020面试整理【java】

    spring面试题 1.你对spring的理解 Spring 是个Java企业级应用的开源开发框架. Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用. Sprin ...

  9. 表的顺序结构---重写Arraylist类

    重写ArrayList类,为防止冲突,重写为MyArrayList,未继承Iterable类. public class MyArrayList<AnyType>{ int N=10; A ...

随机推荐

  1. csdn论坛页抓取

    抓取csdn论坛 实现功能 获取论坛分类所有链接,并拼接成推荐精华页的完成的链接 获取推荐精华页的帖子状态,赏分,帖子标题,作者,发布时间,回复量,查看量,最后发表时间 置顶内容不爬取,只打印置顶内容 ...

  2. RabbitMQ简洁安装

    在实际开发过程中,为了解决并发量大的问题,我们往往会引入消息中间件这个杀手锏,今天带大家先入门一个消息中间件RabbitMQ,我们会从RabbitMQ安装.使用来分享. 1. RabbitMQ安装 这 ...

  3. CTPN

    1. https://zhuanlan.zhihu.com/p/34757009  (原理) 2. https://www.jianshu.com/p/471bdbd0170d (bi-LSTM)

  4. Spring入门(十一):Spring AOP使用进阶

    在上篇博客中,我们了解了什么是AOP以及在Spring中如何使用AOP,本篇博客继续深入讲解下AOP的高级用法. 1. 声明带参数的切点 假设我们有一个接口CompactDisc和它的实现类Blank ...

  5. Docker学习总结(一)--Docker简介

    什么是虚拟化 在计算机中,虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器.网络.内存等,以抽象.转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比之前更好的应用这些资源. 在实 ...

  6. Scala 系列(十)—— 函数 & 闭包 & 柯里化

    一.函数 1.1 函数与方法 Scala 中函数与方法的区别非常小,如果函数作为某个对象的成员,这样的函数被称为方法,否则就是一个正常的函数. // 定义方法 def multi1(x:Int) = ...

  7. 第一篇 特征提取以及openvslam中的相关实现详解

    参考尺度空间理论 金字塔 当用一个机器视觉系统分析未知场景时,计算机没有办法预先知道图像中物体尺度,因此,我们需要同时考虑图像在多尺度下的描述,获知感兴趣物体的最佳尺度.所以在很多时候,我们会在将图像 ...

  8. addTarget原理

    addTarget原理: 当一个控件addTarget时,先到runLoop注册,然后runLoop才会监听该事件,事件处理按照响应者链条   以下以button为例图解:

  9. HDU-3400Line belt-三分再三分-求距离中要加esp

    传送门:Line belt 参考:http://blog.csdn.net/hcbbt/article/details/39375763 题意:在一个平面途中,有一条路ab,还有一条路cd:假设在ab ...

  10. dp递推 hdu1978

    How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...