自己实现ArrayList-通俗易懂

前言

我们知道ArrayList的底层结构是通过数组来实现的,那么我们试着弄个玩玩!

MyList接口

package com.cxx.list;
import java.util.Collection;
/**
 * @Author: cxx
 * 实现自己的list  底层原理:数组
 * 定义好接口
 * @Date: 2018/6/7 16:47
 */
public interface MyList<E> {
    //1.获取数据
    E get(int index);
    //2.新增数据
    void add(E e);
    //3.移除数据
    void remove(int index);
    //4.插入数据
    void insert(int index,E e);
    //5.是否存在数据
    boolean contains(Object o);
    //6.获取长度
    int size();
    //7.是否为空
    boolean isEmpty();
    //8.清空
    void clearList();
}

ArrayList实现类

package com.cxx.list;
/**
 * @Author: cxx
 * @Date: 2018/6/7 16:52
 */
public class MyArrayList<E> implements MyList<E> {
    //默认数组长度
    private static final int DEFAULT_SIZE=10;
    //数组元素
    private Object[] elements=null;
    //数组大小指针
    private int capacity;
    //当前游标
    private int current;
    public MyArrayList(){
        this(DEFAULT_SIZE);
    }
    public MyArrayList(int size){
        if (size<0){
            throw new RuntimeException("数组大小不能小于0");
        }else {
            this.elements=new Object[size];
            this.current=0;
            capacity=size;
        }
    }


    @Override
    public E get(int index) {
        //判断是否越界
        confirmIndex(index);
        return (E)this.elements[index];
    }

    @Override
    public void add(E e) {
        //判断数组容量是否足够
        confirmSize();
        this.elements[current]=e;
        this.current++;
    }

    @Override
    public void remove(int index) {
        confirmIndex(index);
        for (int i = index;i<elements.length;i++){
            //后面值全部向前移动一位
            if (i+1<elements.length){
                elements[i]=elements[i+1];
            }
        }
        this.current--;
    }

    @Override
    public void insert(int index, E e) {
        confirmIndex(index);
        for (int i = 0; i <elements.length ; i++) {
            if (i>=index&&i+2<elements.length){
                elements[i]=e;
                elements[i+1]=elements[i+2];
            }
        }
        this.current++;
    }

    @Override
    public boolean contains(Object o) {
        for (Object element:this.elements){
            if (o.equals(element)){
                return true;
            }
        }
        return false;
    }

    @Override
    public int size() {
        return this.current;
    }

    @Override
    public boolean isEmpty() {
        return this.current>0?true:false;
    }

    @Override
    public void clearList() {
        elements = new Object[DEFAULT_SIZE];
    }

    //确认当前数组容量,如果满足,则不动,否则扩大数组容量
    private void confirmSize(){
        if (this.current==this.capacity){
            this.capacity = this.capacity + this.DEFAULT_SIZE;
            Object[] newElements = new Object[this.capacity];
            for (int i = 0; i <this.elements.length ; i++) {
                newElements[i]=this.elements[i];
            }
            this.elements=newElements;
        }
    }

    //判断下标是否超界
    private void confirmIndex(int index){
        if (index>capacity||index<0){
            throw  new RuntimeException("下标越界");
        }
    }
}

测试代码

package com.cxx.list;
import java.util.ArrayList;
import java.util.List;
/**
 * @Author: cxx
 * @Date: 2018/6/7 17:08
 */
public class MyListTest {
    public static void main(String[] args) {
        MyList<Integer> myList = new MyArrayList();
        for (int i = 0; i <10 ; i++) {
            myList.add(i);
        }
        for (int i = 0; i <myList.size() ; i++) {
            System.out.println(myList.get(i));
        }
    }
}

效果截图

这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_37499059/article/details/80612779
今日推荐