List是一个有序、可以重复,可以有null元素的集合
其中“有序”,指的是存储的时候按照元素的添加顺序进行存储和获取。
e1.equals(e2)
。如果实现该接口的类允许存在null元素,那么就允许存在多个null。public abstract class AbstractList<E>
extends AbstractCollection<E>
implements List<E>
AbstractSequentialList
类比继承AbstractList
要更高效get(int)
和size()
方法set()
方法,如果不重写会抛出UnsupportedOperationException
异常,如果size()
的大小是可变的,那么开发人员还需要重写add(int, E)
和 remove(int)
方法iterator
方法,因为这个抽象类已经实现了iterator()
方法该类只有一个成员变量:该List在结构上已经被修改的次数
protected transient int modCount = 0;
Iterator迭代器和ListIterator迭代器会使用到该变量,如果迭代器的expectModCount与该变量的值不同,那就会抛出ConcurrentModificationException
异常,在官方文档中称其为* fail-fast *
public boolean add(E e)
方法 public boolean add(E e) {
add(size(), e);
return true;
}
源码解析:
UnsupportedOperationException
异常add(int index, E element)
方法null
元素,还有一些列表对元素的其他类型有限制。实现该类的子类应该在其文档中清楚地指定要添加什么元素的任何限制。abstract public E get(int index);
抽象类public E set(int index, E element)
方法 public E set(int index, E element) {
throw new UnsupportedOperationException();
}
源码解析:
- 功能:重置index位置的元素的信息
- 开发人员需要重写该方法
- 调用该方法可能会产生5种异常
- UnsupportedOperationException :如果开发人员没有重写该方法,就会抛出该异常
- ClassCastException :if the class of the specified element prevents it from being added to this list
- NullPointerException :如果该实现类不允许添加Null,而开发人员添加了null
- IllegalArgumentException :if some property of this element prevents it from being added to this list
- IndexOutOfBoundsException :index的值 < 0或者超出了size()的大小
public void add(int index, E element)
方法 public void add(int index, E element) {
throw new UnsupportedOperationException();
}
源码解析:
UnsupportedOperationException
异常public E remove(int index)
方法 public E remove(int index) {
throw new UnsupportedOperationException();
}
源码解析:
UnsupportedOperationException
异常public int indexOf(Object o)
方法 public int indexOf(Object o) {
ListIterator it = listIterator();
if (o==null) {
while (it.hasNext())
if (it.next()==null)
return it.previousIndex();
} else {
while (it.hasNext())
if (o.equals(it.next()))
return it.previousIndex();
}
return -1;
}
源码解析:
(o==null ? get(i)==null : o.equals(get(i)))
。previousIndex()
。因为,没调用一次it.next()
方法,迭代器的游标都会向后移动一位。public int lastIndexOf(Object o)
方法 public int lastIndexOf(Object o) {
ListIterator it = listIterator(size());
if (o==null) {
while (it.hasPrevious())
if (it.previous()==null)
return it.nextIndex();
} else {
while (it.hasPrevious())
if (o.equals(it.previous()))
return it.nextIndex();
}
return -1;
}
源码解析:
hasNext()
而变成hasPrevious()
public void clear()
方法 public void clear() {
removeRange(0, size());
}
源码解析
removeRange(int fromIndex, int toIndex)
方法来实现清除功能removeRange(int fromIndex, int toIndex)
方法,否则会抛出UnsupportedOperationException 异常public boolean addAll(int index, Collection extends E> c)
方法 public boolean addAll(int index, Collection extends E> c) {
rangeCheckForAdd(index);
boolean modified = false;
for (E e : c) {
add(index++, e);
modified = true;
}
return modified;
}
源码解析:
add(int index, E element)
方法,所以想要使用该方法,需要重写add方法,否则会抛出异常。public List subList(int fromIndex, int toIndex)
方法 public List subList(int fromIndex, int toIndex) {
return (this instanceof RandomAccess ?
new RandomAccessSubList<>(this, fromIndex, toIndex) :
new SubList<>(this, fromIndex, toIndex));
}
源码解析:
public boolean equals(Object o)
方法 public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof List))
return false;
ListIterator e1 = listIterator();
ListIterator> e2 = ((List>) o).listIterator();
while (e1.hasNext() && e2.hasNext()) {
E o1 = e1.next();
Object o2 = e2.next();
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return !(e1.hasNext() || e2.hasNext());
}
public int hashCode()
方法 public int hashCode() {
int hashCode = 1;
for (E e : this)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
return hashCode;
}
源码解析:
protected void removeRange(int fromIndex, int toIndex)
方法 protected void removeRange(int fromIndex, int toIndex) {
ListIterator it = listIterator(fromIndex);
for (int i=0, n=toIndex-fromIndex; i
源码解析:
remove()
方法删除元素。private void rangeCheckForAdd(int index)
方法 private void rangeCheckForAdd(int index) {
if (index < 0 || index > size())
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
源码解析:
outOfBoundsMsg()
方法。private String outOfBoundsMsg(int index)
方法 private String outOfBoundsMsg(int index) {
return "Index: "+index+", Size: "+size();
}
源码解析: