专栏首页渔夫Java-创建自定义ArrayList

Java-创建自定义ArrayList

版权声明: https://blog.csdn.net/li_xunhuan/article/details/89153496

/**
* 自己实现一个ArrayList,帮助自己更好地理解ArrayLIst类的底层结构
*/
public class MyArrayList /*implements List*/ {
private Object[] elementData;
private int size;

public int getSize() {
    return size;
}

public boolean isEmpty() {
    return size == 0;
}

public MyArrayList() {
    this(10);
}

public MyArrayList(int initialCapacity) {
    try {
        if (initialCapacity < 0) {
            throw new Exception();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    elementData = new Object[initialCapacity];
}

public void add(Object obj) {
    //实现数组扩容
    ensureCapacity();
    elementData[size++] = obj;
    /*size++;*/
}

public Object get(int index) {
    rangeCheck(index);
    return elementData[index];
}

public void remove(int index) {
    //删除指定位置的对象
    rangeCheck(index);
    int numMoved = size - index - 1;
    System.arraycopy(elementData, index + 1, elementData, index,
            numMoved);
    elementData[--size] = null;
}

public void remove(Object obj) {
    for (int i = 0; i < size; i++) {
        if (get(i).equals(obj)) {
            remove(i);
        }
    }
}

public Object set(int index, Object obj) {
    rangeCheck(index);
    Object oldValue = elementData[index];
    elementData[index] = obj;
    return oldValue;
}

public void add(int index, Object obj) {
    rangeCheck(index);
    ensureCapacity();
    System.arraycopy(elementData, index, elementData, index + 1, size - index);
    elementData[index] = obj;
    size++;
}

private void rangeCheck(int index) {
    if (index < 0 || index >= size) {
        try {
            throw new Exception();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

private void ensureCapacity() {
    if (size == elementData.length) {
        Object[] newArray = new Object[size * 2 + 1];
        System.arraycopy(elementData, 0, newArray, 0, elementData.length);
        elementData = newArray;
    }
}

public static void main(String[] args) {
    MyArrayList list = new MyArrayList(3);
    System.out.println(list.getSize());
    if (list.isEmpty()) {
        System.out.println("数组是空的");
    }

    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    list.add("ddd");
    System.out.println(list.getSize());
    System.out.println(list.isEmpty());
    System.out.println(list.get(3));

    list.remove(3);
    System.out.println(list.getSize());

}
}

知识要点: 一、实际上ArrayList类内部实现的时候还是以数组的形式存数据的;相较于数组,其类型在JDK原码中是用泛型E来定义的,我此处所写Object来描述的; 二、关乎一个动态数组的一些参数: 描述类型:Object 数组的默认大小:int initialCapacity 数组当前的大小(容纳大小):Capacity 数组的目前的大小(null不算): int size 三、对一个动态数组进行插入、移除、增加、定点设置这一系列操作我们都是要对所要执行的位数所判断其有没有越界,这么多操作如果都进行操作合法性的判断,那么最合理的方式是用封装解决这个问题,在类里面private描述一个rangeCheck方法,只供类内部的方法所调用; 四、还有一个关键问题是ArrayList类内部的数组大小不够用了怎么办? 这也是用一个封装来实现比较好----我们使数组只要增加一个元素,size++;数组减少一个元素,size–;在这个默认前提下,编写一个封装,只要以一发现数组size==elementData.length,那么就再新建一个数组newArray,并且使这个数组的大小设置为size*2+1;并调用System的数组复制功能System.arraycopy();实现原数组到新数组元素的全盘复制;最后再让原数组elementData=newArray,原数组名指向了新数组对象

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊feign的Retryer

    feign-core-10.2.3-sources.jar!/feign/Retryer.java

    codecraft
  • 聊聊feign的RequestInterceptor

    feign-core-10.2.3-sources.jar!/feign/RequestInterceptor.java

    codecraft
  • JAVA:如何发邮件?

    SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)定义了邮件客户端与SMTP服务器之间,以及两台SMTP服务器之间发送邮件...

    WEBJ2EE
  • JSP:自定义标签技术

    JSP 标签是 JavaServer Pages 技术中的特殊语法,它看起来就像普通的 HTML 或者 XML 标签一样。

    WEBJ2EE
  • Java虚拟机详解(三)------垃圾回收

      如果对C++这门语言熟悉的人,再来看Java,就会发现这两者对垃圾(内存)回收的策略有很大的不同。

    IT可乐
  • JS:类型、类型转换

    正解是:JavaScript 中的变量没有类型,但值有类型。变量可以随时持有任何类型的值。

    WEBJ2EE
  • ES6:原型、类、继承

    JavaScript 没有类,只有对象!所谓的类、继承都只是借助 JavaScript 原型链机制模拟实现的。事实上 ES6 中新加入的 class、exten...

    WEBJ2EE
  • 为什么老外都不愿意用MyBatis?

    本文选自知乎问答「为什么国内流行mybatis,国外反而多用hibernate?」

    Java技术栈
  • React:Table 那些事(3-1)—— 基础表格、边框控制

    《React:Table 那些事》系列文章,会逐渐给大家呈现一个基于 React 的 Table 组件的定义、设计、开发过程。每篇文章都会针对 Table 的某...

    WEBJ2EE
  • WEB:还是文件上传...

    IE8、9环境下,只能用 form 上传文件,而且 <input type="file"> 只能单选;

    WEBJ2EE

扫码关注云+社区

领取腾讯云代金券