📄 persistentlistimpl.java
字号:
pg.items.setObject(1, root);
pg.nChildren[1] = Integer.MAX_VALUE;
pg.nItems = 2;
root = pg;
}
nElems += 1;
modCount += 1;
modify();
}
public E remove(int i) {
if (i < 0 || i >= nElems) {
throw new IndexOutOfBoundsException("index=" + i + ", size=" + nElems);
}
E obj = (E)root.remove(i);
if (root.nItems == 1 && root instanceof ListIntermediatePage) {
ListPage newRoot = (ListPage)root.items.get(0);
root.deallocate();
root = newRoot;
}
nElems -= 1;
modCount += 1;
modify();
return obj;
}
public void clear() {
modCount += 1;
root.prune();
root = new ListPage(getStorage());
nElems = 0;
modify();
}
public int indexOf(Object o) {
ListIterator<E> e = listIterator();
if (o==null) {
while (e.hasNext())
if (e.next()==null)
return e.previousIndex();
} else {
while (e.hasNext())
if (o.equals(e.next()))
return e.previousIndex();
}
return -1;
}
public int lastIndexOf(Object o) {
ListIterator<E> e = listIterator(size());
if (o==null) {
while (e.hasPrevious())
if (e.previous()==null)
return e.nextIndex();
} else {
while (e.hasPrevious())
if (o.equals(e.previous()))
return e.nextIndex();
}
return -1;
}
public boolean addAll(int index, Collection<? extends E> c) {
boolean modified = false;
Iterator<? extends E> e = c.iterator();
while (e.hasNext()) {
add(index++, e.next());
modified = true;
}
return modified;
}
public Iterator<E> iterator() {
return new Itr();
}
public ListIterator<E> listIterator() {
return listIterator(0);
}
public ListIterator<E> listIterator(int index) {
if (index<0 || index>size())
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
private class Itr extends TreePosition implements PersistentIterator, Iterator<E> {
/**
* Index of element to be returned by subsequent call to next.
*/
int cursor = 0;
/**
* Index of element returned by most recent call to next or
* previous. Reset to -1 if this element is deleted by a call
* to remove.
*/
int lastRet = -1;
/**
* The modCount value that the iterator believes that the backing
* List should have. If this expectation is violated, the iterator
* has detected concurrent modification.
*/
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size();
}
public int nextOid() {
checkForComodification();
try {
int oid = getRawPosition(this, cursor).getOid();
lastRet = cursor++;
return oid;
} catch(IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public E next() {
checkForComodification();
try {
E next = getPosition(this, cursor);
lastRet = cursor++;
return next;
} catch(IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public void remove() {
if (lastRet == -1) {
throw new IllegalStateException();
}
checkForComodification();
try {
PersistentListImpl.this.remove(lastRet);
if (lastRet < cursor) {
cursor--;
}
page = null;
lastRet = -1;
expectedModCount = modCount;
} catch(IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
final void checkForComodification() {
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
}
private class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
cursor = index;
}
public boolean hasPrevious() {
return cursor != 0;
}
public E previous() {
checkForComodification();
try {
int i = cursor - 1;
E previous = getPosition(this, i);
lastRet = cursor = i;
return previous;
} catch(IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public int nextIndex() {
return cursor;
}
public int previousIndex() {
return cursor-1;
}
public void set(E o) {
if (lastRet == -1) {
throw new IllegalStateException();
}
checkForComodification();
try {
PersistentListImpl.this.set(lastRet, o);
expectedModCount = modCount;
} catch(IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
public void add(E o) {
checkForComodification();
try {
PersistentListImpl.this.add(cursor++, o);
lastRet = -1;
page = null;
expectedModCount = modCount;
} catch(IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
}
public List<E> subList(int fromIndex, int toIndex) {
return new SubList<E>(this, fromIndex, toIndex);
}
protected void removeRange(int fromIndex, int toIndex) {
while (fromIndex < toIndex) {
remove(fromIndex);
toIndex -= 1;
}
}
PersistentListImpl() {}
PersistentListImpl(Storage storage) {
super(storage);
root = new ListPage(storage);
}
}
class SubList<E extends IPersistent> extends AbstractList<E> {
private PersistentListImpl<E> l;
private int offset;
private int size;
private int expectedModCount;
SubList(PersistentListImpl<E> list, int fromIndex, int toIndex) {
if (fromIndex < 0) {
throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
}
if (toIndex > list.size()) {
throw new IndexOutOfBoundsException("toIndex = " + toIndex);
}
if (fromIndex > toIndex) {
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex + ")");
}
l = list;
offset = fromIndex;
size = toIndex - fromIndex;
expectedModCount = l.modCount;
}
public E set(int index, E element) {
rangeCheck(index);
checkForComodification();
return l.set(index+offset, element);
}
public E get(int index) {
rangeCheck(index);
checkForComodification();
return l.get(index+offset);
}
public int size() {
checkForComodification();
return size;
}
public void add(int index, E element) {
if (index<0 || index>size) {
throw new IndexOutOfBoundsException();
}
checkForComodification();
l.add(index+offset, element);
expectedModCount = l.modCount;
size++;
modCount++;
}
public E remove(int index) {
rangeCheck(index);
checkForComodification();
E result = l.remove(index+offset);
expectedModCount = l.modCount;
size--;
modCount++;
return result;
}
protected void removeRange(int fromIndex, int toIndex) {
checkForComodification();
l.removeRange(fromIndex+offset, toIndex+offset);
expectedModCount = l.modCount;
size -= (toIndex-fromIndex);
modCount++;
}
public boolean addAll(Collection<? extends E> c) {
return addAll(size, c);
}
public boolean addAll(int index, Collection<? extends E> c) {
if (index<0 || index>size) {
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
}
int cSize = c.size();
if (cSize==0) {
return false;
}
checkForComodification();
l.addAll(offset+index, c);
expectedModCount = l.modCount;
size += cSize;
modCount++;
return true;
}
public Iterator<E> iterator() {
return listIterator();
}
public ListIterator<E> listIterator(final int index) {
checkForComodification();
if (index<0 || index>size) {
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
}
return new ListIterator<E>() {
private ListIterator<E> i = l.listIterator(index+offset);
public boolean hasNext() {
return nextIndex() < size;
}
public E next() {
if (hasNext()) {
return i.next();
} else {
throw new NoSuchElementException();
}
}
public boolean hasPrevious() {
return previousIndex() >= 0;
}
public E previous() {
if (hasPrevious()) {
return i.previous();
} else {
throw new NoSuchElementException();
}
}
public int nextIndex() {
return i.nextIndex() - offset;
}
public int previousIndex() {
return i.previousIndex() - offset;
}
public void remove() {
i.remove();
expectedModCount = l.modCount;
size--;
modCount++;
}
public void set(E o) {
i.set(o);
}
public void add(E o) {
i.add(o);
expectedModCount = l.modCount;
size++;
modCount++;
}
};
}
public List<E> subList(int fromIndex, int toIndex) {
return new SubList<E>(l, offset+fromIndex, offset+toIndex);
}
private void rangeCheck(int index) {
if (index<0 || index>=size) {
throw new IndexOutOfBoundsException("Index: "+index+
",Size: "+size);
}
}
private void checkForComodification() {
if (l.modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -