学习java AbstarctList源码

package learningCollection;

import java.util.*;
//从这里我们可以看出来由虚类list到实现类list是使用了类的适配器模式的,继承了上一个类实现了相关的接口,这里没有出现用来大量存储数据
//的结构,比如说数组,链表结构,只是定义了相关函数,和相关使用的指标。
public abstract class AbstractList extends AbstractCollection implements List {
//改变次数
protected transient int modCount = 0;

protected AbstractList() {
}

//增删改查
public boolean add(E var1) {
    this.add(this.size(), var1);
    return true;
}

public abstract E get(int var1);

public E set(int var1, E var2) {
    throw new UnsupportedOperationException();
}

public void add(int var1, E var2) {
    throw new UnsupportedOperationException();
}

public E remove(int var1) {
    throw new UnsupportedOperationException();
}

//查看第一个某个元素的位置,没有的话就返回-1,查找的null就返回最后一个数据
public int indexOf(Object var1) {
    ListIterator var2 = this.listIterator();
    if(var1 == null) {
        while(var2.hasNext()) {
            if(var2.next() == null) {
                return var2.previousIndex();
            }
        }
    } else {
        while(var2.hasNext()) {
            if(var1.equals(var2.next())) {
                return var2.previousIndex();
            }
        }
    }

    return -1;
}

//最后一个某元素,从后向前查找的,没有的话返回-1,超赵null返回第一个
public int lastIndexOf(Object var1) {
    ListIterator var2 = this.listIterator(this.size());
    if(var1 == null) {
        while(var2.hasPrevious()) {
            if(var2.previous() == null) {
                return var2.nextIndex();
            }
        }
    } else {
        while(var2.hasPrevious()) {
            if(var1.equals(var2.previous())) {
                return var2.nextIndex();
            }
        }
    }

    return -1;
}

//清空
public void clear() {
    this.removeRange(0, this.size());
}

//添加另一个集合主要通过迭代另外一个集合加入本集合中
public boolean addAll(int var1, Collection<? extends E> var2) {
    this.rangeCheckForAdd(var1);
    boolean var3 = false;

    for(Iterator var4 = var2.iterator(); var4.hasNext(); var3 = true) {
        Object var5 = var4.next();
        this.add(var1++, var5);
    }

    return var3;
}

//获取迭代器
public Iterator<E> iterator() {
    return new AbstractList.Itr();
}

//获取list迭代器,list迭代器由向前迭代,前后位置,和set get函数是继承了Iterator的
public ListIterator<E> listIterator() {
    return this.listIterator(0);
}

//获取某个位置开始的list迭代器
public ListIterator<E> listIterator(int var1) {
    this.rangeCheckForAdd(var1);
    return new AbstractList.ListItr(var1);
}

//获取子list从var1 到var2
public List<E> subList(int var1, int var2) {
    return (List)(this instanceof RandomAccess ?new RandomAccessSubList(this, var1, var2):new SubList(this, var1, var2));
}

//检测是不是同一个对象
public boolean equals(Object var1) {
    if(var1 == this) {
        return true;
    } else if(!(var1 instanceof List)) {
        return false;
    } else {
        ListIterator var2 = this.listIterator();
        ListIterator var3 = ((List)var1).listIterator();

        while(true) {
            if(var2.hasNext() && var3.hasNext()) {
                Object var4 = var2.next();
                Object var5 = var3.next();
                if(var4 == null) {
                    if(var5 == null) {
                        continue;
                    }
                } else if(var4.equals(var5)) {
                    continue;
                }

                return false;
            }

            return !var2.hasNext() && !var3.hasNext();
        }
    }
}

public int hashCode() {
    int var1 = 1;

    Object var3;
    for(Iterator var2 = this.iterator(); var2.hasNext(); var1 = 31 * var1 + (var3 == null?0:var3.hashCode())) {
        var3 = var2.next();
    }

    return var1;
}


//将某个范围内的元素移除,迭代器是有remove方法的,protected方法在外部是不能使用的,private更是本地的辅助方法。
protected void removeRange(int var1, int var2) {
    ListIterator var3 = this.listIterator(var1);
    int var4 = 0;

    for(int var5 = var2 - var1; var4 < var5; ++var4) {
        var3.next();
        var3.remove();
    }

}

private void rangeCheckForAdd(int var1) {
    if(var1 < 0 || var1 > this.size()) {
        throw new IndexOutOfBoundsException(this.outOfBoundsMsg(var1));
    }
}

private String outOfBoundsMsg(int var1) {
    return "Index: " + var1 + ", Size: " + this.size();
}

//本集合list迭代器的 具体实现
private class ListItr extends AbstractList<E>.Itr implements ListIterator<E> {
    ListItr(int var2) {
        super(null);
        this.cursor = var2;
    }

    public boolean hasPrevious() {
        return this.cursor != 0;
    }

    public E previous() {
        this.checkForComodification();

        try {
            int var1 = this.cursor - 1;
            Object var2 = AbstractList.this.get(var1);
            this.lastRet = this.cursor = var1;
            return var2;
        } catch (IndexOutOfBoundsException var3) {
            this.checkForComodification();
            throw new NoSuchElementException();
        }
    }

    public int nextIndex() {
        return this.cursor;
    }

    public int previousIndex() {
        return this.cursor - 1;
    }

    public void set(E var1) {
        if(this.lastRet < 0) {
            throw new IllegalStateException();
        } else {
            this.checkForComodification();

            try {
                AbstractList.this.set(this.lastRet, var1);
                this.expectedModCount = AbstractList.this.modCount;
            } catch (IndexOutOfBoundsException var3) {
                throw new ConcurrentModificationException();
            }
        }
    }

    public void add(E var1) {
        this.checkForComodification();

        try {
            int var2 = this.cursor;
            AbstractList.this.add(var2, var1);
            this.lastRet = -1;
            this.cursor = var2 + 1;
            this.expectedModCount = AbstractList.this.modCount;
        } catch (IndexOutOfBoundsException var3) {
            throw new ConcurrentModificationException();
        }
    }
}

//本集合迭代器类的具体实现,在类的内部定义就不需要以原数据结构作为成员了,以后我们的迭代器也可以封装在类内部。
private class Itr implements Iterator<E> {
    int cursor;
    int lastRet;
    int expectedModCount;

    private Itr() {
        this.cursor = 0;
        this.lastRet = -1;
        this.expectedModCount = AbstractList.this.modCount;
    }

    public boolean hasNext() {
        return this.cursor != AbstractList.this.size();
    }

    public E next() {
        this.checkForComodification();

        try {
            int var1 = this.cursor;
            Object var2 = AbstractList.this.get(var1);
            this.lastRet = var1;
            this.cursor = var1 + 1;
            return var2;
        } catch (IndexOutOfBoundsException var3) {
            this.checkForComodification();
            throw new NoSuchElementException();
        }
    }

    public void remove() {
        if(this.lastRet < 0) {
            throw new IllegalStateException();
        } else {
            this.checkForComodification();

            try {
                AbstractList.this.remove(this.lastRet);
                if(this.lastRet < this.cursor) {
                    --this.cursor;
                }

                this.lastRet = -1;
                this.expectedModCount = AbstractList.this.modCount;
            } catch (IndexOutOfBoundsException var2) {
                throw new ConcurrentModificationException();
            }
        }
    }

    final void checkForComodification() {
        if(AbstractList.this.modCount != this.expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值