自定义动态数组

参照Java源码,自定义实现动态数组ArrayList:

主要实现数组的增、删、查、改方法,实现过程中要考虑:

  • 下标是否越界
  • 在中间插入元素,后面的每一个元素都要往后挪一位
  • 在中间删除元素,后面的每一个元素都要往前挪一位
  • 检测是否需要动态扩容等等

实现代码大致如下:

import java.util.Arrays;public class ArrayList<E> {

    /*
    * 数组的大小
    * */
    private int size;

    /*
    * 存放元素的数组
    * */
    private E[] elements;

    private static final int DEFAULT_CAPACITY = 10;
    private static final int ELEMENT_NOT_FOUND = -1;

    public ArrayList(int lenth) {
        lenth = (lenth < DEFAULT_CAPACITY)? DEFAULT_CAPACITY : lenth;
        elements = (E[]) new Object[lenth];
    }

    public ArrayList() {
        this(DEFAULT_CAPACITY);
    }

    /*
    * 给数组添加一个元素
    * */
    public void add(E element){
        add(size,element);
    }

    /*
    * 在指定位置添加一个元素
    * */
    public void add(int index,E element){
        checkForAddRange(index);
        //先确认一下新加一个元素是否有容量
        ensureCapacity(size + 1);
        //从末尾到index的每一个元素都要往后挪挪位置
        for (int i = size; i > index;i--){
            elements[i] = elements[i -1];
        }

        elements[index] = element;
        size++;
    }

    /*
    * 删除指定位置的元素
    * */
    public E delete(int index){
        checkForRange(index);
        E old = elements[index];
        //从index到末尾的每一个元素都要往前挪一位
        for (int i = index+1; i < size; i++){
            elements[i-1] = elements[i];
        }
        elements[--size] = null;
        return old;
    }

    /*
    * 获取指定位置的元素
    * */
    public E get(int index){
        checkForRange(index);
        return elements[index];
    }

    /*
    * 根据元素找到其所在位置的下标
    * */
    public int indexOf(E element){
        if (element == null){
            for (int i = 0;i < size;i++){
                if (elements[i] == null) return i;
            }
        }else {
            for (int i = 0; i<size ;i++){
                if (elements[i].equals(element)) return i;
            }
        }
        return ELEMENT_NOT_FOUND;
    }

    /*
    * 将指定位置的元素替换
    * */
    public E set(int index,E element){
        checkForRange(index);
        E old = elements[index];
        elements[index] = element;
        return old;
    }


    /*
    *清除所有的元素
    * */
    public void clear(){
        for (int i = 0 ; i < size; i++){
            elements[i] = null;
        }
        size = 0;
    }

    /*
    * 素组的大小
    * */
    public int size(){
        return size;
    }

    /*
    * 素组是否为空
    * */
    public boolean isEmpty(){
        return size == 0;
    }

    /*
    * 判断素组是否包含某元素
    * */
    public boolean contains(E element){
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }

    /*
    * 添加元素时候检查位置是否正确
    * */
    private void checkForAddRange(int index){
        if (index < 0 || index > size)
            throw new  IndexOutOfBoundsException("Index: [" + index + "] is not a valid index");
    }

    /*
     * 检查指定位置是否存在
     * */
    private void checkForRange(int index){
        if (index < 0 || index >= size)
            throw new  IndexOutOfBoundsException("Index: [" + index + "] is not a valid index");
    }

    private void ensureCapacity(int capacity){
        int oldCapacity = elements.length;
        if (oldCapacity >= capacity) return;
        //容量不够 在原来的基础上 + 0.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //把旧的数组挪到新的数组上来
        E[] newElements = (E[]) new Object[newCapacity];
         for (int i = 0;i < oldCapacity;i++){
             newElements[i] = elements[i];
         }
         elements = newElements;
    }

    @Override
    public String toString() {
        return "ArrayList{" +
                "size=" + size +
                ", elements=" + Arrays.toString(elements) +
                '}';
    }
}

基本实现主要功能,测试代码:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) return false;

        if (obj instanceof Person){
            Person person = (Person) obj;
            if (person.age == this.age && person.name.equals(this.name))
                return true;
        }
        return false;
    }
}
View Code
public class Main {

    public static void main(String[] args) {

        ArrayList<Person> list = new ArrayList<>();

        for (int i = 0; i < 3; i++){
            list.add(new Person("role" + i,18));
        }
        System.out.println(list.toString());


        list.add(2,new Person("Jack",22));
        System.out.println(list.toString());

        list.delete(3);
        System.out.println(list.toString());

        System.out.println(list.contains(new Person("Jack",22)));

        list.clear();
        System.out.println(list.toString());



    }
}

测试截图:

posted @ 2020-11-24 23:43  行云至他方  阅读(136)  评论(0编辑  收藏  举报