动手实现ArrayList

ArrayList大家应经常用吧。今天我们来做一个仿照的MyList

实现起来也很简单

一、成员变量

    我们要存数据,那么得有一个泛型数组,还要有List的长度,还有List的容量。

    属性定义如下

//存放数据的数组
protected T[] data;
//数组的长度
protected int length;
//数组的容量
private int capacity;

二、接下来是各种操作列表的方法

    首先看构造方法,如下,提供个两种构造方法,默认构造和无参构造

//默认构造
public MyList(){
    this(10);
}
//带参构造
public MyList(int capacity){
    if (capacity<=0)
        capacity = 10;
    length = 0;
    data = (T[]) new Object[capacity];
}

    求列表长度方法很简单,就不多说了,直接返回属性变量length就行

//size方法
public int size(){
    return length;
}

    接下来看添加方法,我实现了两种,一种是添加元素到末尾,另一种是在指定位置添加元素

    添加时只需要注意一点,那就是扩容问题,当数组长度等于属性变量length时,说明数组已经满了,需要扩容

    下面看实现

//add方法
public void add(T x){
    if (length == data.length)
        grow();
    data[length] = x;
    length++;
}
//指定位置插入
public void add(int i,T x){
    if (length == data.length)
        grow();
    if (i<0)
        i=0;
    if (i>length)
        i = length;
    for (int j=length-1;j>=i;j--)
        data[j+1] = data[j];
    data[i] = x;
    length++;
}

    get方法也很简单,只要注意传入的参数是否有效

//get方法
public T get(int index){
    if (index<0 || index>length-1)
        throw new IndexOutOfBoundsException();
    return data[index];
}

    查找方法也很简单,遍历数组判断就行。注意null值和非null值

//查找元素
public int indexOf(T x){
    if (x==null){
        for (int i=0;i<length;i++){
            if (data[i] == null)
                return i;
        }
    }else {
        for (int i = 0; i < length; i++) {
            if (data[i] == x)
                return i;
        }
    }
    return -1;
}

    接下来是移除元素方法,这里也是两个方法,一个是移除指定下标的元素,另外一个移除指定元素,下面看实现

//删除列表中的元素
public T remove(int i){
    if (i<0 || i>=length)
        throw new IndexOutOfBoundsException();
    T old = data[i];
    for (int j=i;j<length;j++)
        data[j] = data[j+1];
    data[--length] = null;
    return old;
}

//删除特定的元素
public T remove(T x) {
    int i = indexOf(x);
    return remove(i);
}
    扩容方法,我实现的很简单,只是单纯的将原长度加5。

private void grow() {
    int newSize = data.length + 5;
    capacity = newSize;
    data = Arrays.copyOf(data,newSize);
}

    迭代器其实也挺简单的,当然,我只实现了hashNext和next方法。看实现吧

@Override
public Iterator<T> iterator() {
    return null;
}

class MyIteator implements Iterator<T>{
    private int index = 0;
    @Override
    public boolean hasNext() {
        return index != size();
    }

    @Override
    public T next() {
        return get(index++);
    }
}

   是不是挺简单,实现简单的列表可以加深我们对ArrayList的理解,源代码附上。

    

import java.util.Arrays;
import java.util.Iterator;

public class MyList<T> implements Iterable<T> {
    //存放数据的数组
    protected T[] data;
    //数组的长度
    private int length;
    //数组的容量
    private int capacity;
    //默认构造
    public MyList(){
        this(10);
    }
    //带参构造
    public MyList(int capacity){
        if (capacity<=0)
            capacity = 10;
        length = 0;
        data = (T[]) new Object[capacity];
    }
    //size方法
    public int size(){
        return length;
    }

    //get方法
    public T get(int index){
        if (index<0 || index>length-1)
            throw new IndexOutOfBoundsException();
        return data[index];
    }

    //add方法
    public void add(T x){
        if (length == data.length)
            grow();
        data[length] = x;
        length++;
    }

    //set方法
    public boolean set(int i,T x){
        if (i<0 || i>=length)
            return false;
        data[i] = x;
        return true;
    }

    //删除列表中的元素
    public T remove(int i){
        if (i<0 || i>=length)
            throw new IndexOutOfBoundsException();
        T old = data[i];
        for (int j=i;j<length;j++)
            data[j] = data[j+1];
        data[--length] = null;
        return old;
    }

    //删除特定的元素
    public T remove(T x) {
        int i = indexOf(x);
        return remove(i);
    }

    //查找元素
    public int indexOf(T x){
        if (x==null){
            for (int i=0;i<length;i++){
                if (data[i] == null)
                    return i;
            }
        }else {
            for (int i = 0; i < length; i++) {
                if (data[i] == x)
                    return i;
            }
        }
        return -1;
    }

    //指定位置插入
    public void add(int i,T x){
        if (length == data.length)
            grow();
        if (i<0)
            i=0;
        if (i>length)
            i = length;
        for (int j=length-1;j>=i;j--)
            data[j+1] = data[j];
        data[i] = x;
        length++;
    }

    //清除方法
    public void clear(){
        for (int i=0;i<length;i++)
            data[i] = null;
        length = 0;
        capacity = 0;
    }

    private void grow() {
        int newSize = data.length + 5;
        capacity = newSize;
        data = Arrays.copyOf(data,newSize);
    }

    @Override
    public Iterator<T> iterator() {
        return null;
    }

    class MyIteator implements Iterator<T>{
        private int index = 0;
        @Override
        public boolean hasNext() {
            return index != size();
        }

        @Override
        public T next() {
            return get(index++);
        }
    }
}


Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325688949&siteId=291194637