• 技术文章 >Java >java教程

    JAVA如何实现线性表顺序存储结构ArrayList

    伊谢尔伦伊谢尔伦2016-11-21 11:14:26原创1014
    集合ArrayList底层结构使用的是数组,主要实现的方法有增删改查,其中核心的部分是当增加一个元素时候的数组扩容处理。不多说,直接上代码:

    /**
     * ArrayList底层使用数组结构,暴露方法,增删改查 其中元素增加,需要判断数组的长度
     */
    public class MyArrayList<E> {
    private Object[] array;// 存放元素的数组
    private Object[] EMPTY_ARRAY = {};// 空数组
    private static final int DEFAULT_CAPACITY = 8;// 默认数组长度
    private int size;// 数组中元素的个数
    private int modSize;// 线性表修改的次数
    public MyArrayList() {
    array = EMPTY_ARRAY;// 默认是给个空数组还是给个8个空间的数组呢?
    }
    public MyArrayList(int initCapacity) {
    if (initCapacity < 0) {// 传入的数量为负数,抛出异常
    throw new IllegalArgumentException("参数错误:" + initCapacity);
    } else if (initCapacity == 0) {// 空数组
    array = EMPTY_ARRAY;
    } else {
    array = new Object[initCapacity];
    }
    }
    public MyArrayList(Collection<E> c) {
    Object[] obj = c.toArray();
    if ((size = obj.length) != 0) {// 将Collection中的数据拷贝出来,防止污染
    System.arraycopy(obj, 0, array, 0, size);
    } else {
    array = EMPTY_ARRAY;
    }
    }
    /**
    * 添加一个元素到线性表尾部->先判断数组大小和元素个数是否相同-》相同的话,需要扩容
    * 
    * @param e
    * @return
    */
    public boolean add(E e) {
    array = judgeIsGrow();
    array[size] = e;
    size++;
    modSize++;
    return true;
    }
    // 判断是否扩容
    private Object[] judgeIsGrow() {
    if (size == array.length) {
    // 确定新数组的大小--》new出来--》将原来数组的数据拷贝到新数组中
    int newSize = 0;
    if (size == 0) {
    newSize = DEFAULT_CAPACITY;
    } else {
    newSize = size < Integer.MAX_VALUE / 2 ? size << 1 : Integer.MAX_VALUE;
    }
    Object[] newArray = new Object[newSize];
    System.arraycopy(array, 0, newArray, 0, size);
    array = newArray;
    }
    return array;
    }
    /**
    * 在第index位置插入一个元素
    * 
    * @param index
    * @param e
    * @return
    */
    public boolean add(int index, E e) {
    checkArgument(index);
    array = judgeIsGrow();
    Object[] newObj = new Object[array.length];
    // 将array数组中的元素拷贝到新数组中
    System.arraycopy(array, 0, newObj, 0, index);
    System.arraycopy(array, index, newObj, index + 1, size- index);
    newObj[index] = e;
    array = newObj;
    size++;
    modSize++;
    return true;
    }
    // 参数检查
    private void checkArgument(int index) {
    if (index < 0) {
    throw new IllegalArgumentException("参数错误:" + index);
    } else if (index > size) {
    throw new IllegalArgumentException("超过数组长度,参数错误:" + index);
    }
    }
    /**
    * 删除第index个元素
    * 
    * @param index
    * @return
    */
    @SuppressWarnings("unchecked")
    public E remove(int index) {
    Object[] newObj = new Object[array.length];
    E obj = (E) array[index];
    // 将array数组中的元素拷贝到新数组中
    System.arraycopy(array, 0, newObj, 0, index);
    System.arraycopy(array, index + 1, newObj, index, size - index - 1);
    array = newObj;
    size--;
    modSize++;
    return obj;
    }
    @SuppressWarnings("unchecked")
    public E get(int index) {
    return (E) array[index];
    }
    public void set(int index, E e) {
    array[index] = e;
    }
    public int size() {
    return size;
    }
    public static void main(String[] args) {
    MyArrayList<String> list = new MyArrayList<>();
    for (int i = 0; i < 10; i++) {
    list.add("data "+i);
    }
    list.add(2,"add23");
    list.add(11,"dddd");
    list.remove(3);
    list.set(9, "dajdfljfl");
    int size = list.size();
    for (int i = 0; i < size; i++) {
    System.out.println("元素:"+(i+1)+" == " + list.get(i));
    }
    }
    }

    最后打印结果为:

    元素:1 == data 0

    元素:2 == data 1

    元素:3 == add23

    元素:4 == data 3

    元素:5 == data 4

    元素:6 == data 5

    元素:7 == data 6

    元素:8 == data 7

    元素:9 == data 8

    元素:10 == dajdfljfl

    元素:11 == dddd

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:JAVA ArrayList
    上一篇:Java -- 多线程 下一篇:如何解决web项目中遇到的Maven包依赖冲突问题
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• Java中的Object类知识点归纳• 一文掌握JAVA 面向对象之多态• 完全掌握Java锁(图文解析)• 深入解析Java中的方法引用• 实例详解Java基础的控制语句
    1/1

    PHP中文网