数据结构 -- 实现ArrayList

代码

package com.mybatis.test;

import com.sun.org.apache.xalan.internal.xsltc.dom.ArrayNodeListIterator;

import java.util.Iterator;

/**
 * @ClassName MyArrayList
 * @Description 实现ArrayList
 * @Author 
 * @Date 2019/10/12 9:38
 * @Version 1.0
 **/
public class MyArrayList<T> implements Iterable<T> {

    private static final int DEFAULT_CAPACITY = 10;

    /**
     * 当前的项数
     */
    private int theSize;
    /**
     * 数组
     */
    private T[] theItems;

    /**
     * 构造函数
     */
    public MyArrayList(){
        doClear();
    }

    /**
     * 清除所有
     */
    public void clear(){
        doClear();
    }

    /**
     * 清除
     */
    public void doClear(){
        theSize = 0;
        ensureCapacity(DEFAULT_CAPACITY);
    }

    /**
     * 返回当前项数
     */
    public int size(){
        return theSize;
    }

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

    /**
     * 设置数组的大小与当前项数一样
     */
    public void trimToSize(){
        ensureCapacity(size());
    }

    /**
     * get方法
     */
    public T get(int idx){
        if(idx <0 ||idx >=size()){
            throw new ArrayIndexOutOfBoundsException();
        }
        return theItems[idx];
    }

    /**
     * set方法
     */
    public T set(int idx,T newVal){
        if(idx < 0||idx >=size()){
            throw new ArrayIndexOutOfBoundsException();
        }
        T old = theItems[idx];
        theItems[idx] = newVal;
        return old;
    }

    /**
     * 设置容量
     */
    public void ensureCapacity(int newCapacity){
        if(newCapacity < theSize){
            return;
        }
        T[] old = theItems;
        theItems = (T[])new Object[newCapacity];
        for (int i = 0;i < size();i++){
            theItems[i] = old[i];
        }
    }

    /**
     * 从末尾添加
     */
    public boolean add(T x){
        add(size(),x);
        return true;
    }

    /**
     * 指定位置添加
     */
    public void add(int idx,T x){
        if(theItems.length == size()){
            ensureCapacity(size()*2+1);
        }
        for(int i = theSize;i > idx;i--){
            theItems[i] = theItems[i - 1];
        }
        theItems[idx] = x;
        theSize++;
    }

    /**
     * 删除
     */
    public T remove(int idx) {
        T removedItem = theItems[idx];
        for (int i = idx; i < size() - 1; i++) {
            theItems[i] = theItems[i + 1];
        }
        theSize--;
        return removedItem;
    }

    /**
     * 迭代器
     */
    public Iterator<T> iterator() {
        return new ArrayListIterator();
    }

    private class ArrayListIterator implements Iterator<T>{

        private int current = 0;

        public boolean hasNext() {
            return current < size();
        }

        public T next() {
            if(!hasNext()){
                throw new java.util.NoSuchElementException();
            }
            return theItems[current++];
        }
        public void remove(){
            MyArrayList.this.remove(--current);
        }
    }
}

  • 这里面theSize是当前集合的项数,theItems是这个集合的数组
  • doclear方法用于初始化数组或者清除数组
  • size方法返回当前的项数
  • isEmpty方法判断是否为空
  • tirmToSize方法将集合的容量设置为与项数相同
  • get和set方法不说了
  • ensureCapacity方法用于指定数组的容量、扩容等功能
  • 两个add方法,一个是指定位置添加,另一个是从末尾添加
  • remove移除
  • iterator方法返回一个迭代器
发布了134 篇原创文章 · 获赞 91 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/weixin_44588495/article/details/102597152