java原始碼學習-AbstractSequentialList

星光之子0317發表於2020-11-29

介紹

  • Abstract(抽象類)Sequential(可序化)List(列表)
  • 繼承了 列表抽象類AbstractList
  • 是LinkedList的父類

類圖

在這裡插入圖片描述

屬性

方法

構造方法

protected AbstractSequentialList() {
}

迭代器

@Override
public Iterator<E> iterator() {
	return listIterator();
}

@Override
public abstract ListIterator<E> listIterator(int index);

新增元素

// 新增 指定元素element 到 指定位置index,將 當前 處於該位置的元素(如果有的話)和 任何後續元素 移到右邊(新增一個到它們的索引)
@Override
public void add(int index, E element) {
	try {
		// 先獲取一個 指定位置開始的 迭代器,然後再進行新增
		listIterator(index).add(element);
	} catch (NoSuchElementException exc) {
		throw new IndexOutOfBoundsException("Index: "+index);
	}
}

@Override
public boolean addAll(int index, Collection<? extends E> c) {
	try {
		boolean modified = false;
		ListIterator<E> e1 = listIterator(index);
		Iterator<? extends E> e2 = c.iterator();
		while (e2.hasNext()) {
			// 用獲取到的ListIterator 進行新增
			e1.add(e2.next());
			modified = true;
		}
		return modified;
	} catch (NoSuchElementException exc) {
		throw new IndexOutOfBoundsException("Index: "+index);
	}
}

獲取元素

@Override
public E get(int index) {
	try {
		return listIterator(index).next();
	} catch (NoSuchElementException exc) {
		throw new IndexOutOfBoundsException("Index: "+index);
	}
}

移除元素

@Override
public E remove(int index) {
	try {
		ListIterator<E> e = listIterator(index);
		E outCast = e.next();
		e.remove();
		return outCast;
	} catch (NoSuchElementException exc) {
		throw new IndexOutOfBoundsException("Index: "+index);
	}
}

替換元素

@Override
public E set(int index, E element) {
	try {
		ListIterator<E> e = listIterator(index);
		E oldVal = e.next();
		e.set(element);
		return oldVal;
	} catch (NoSuchElementException exc) {
		throw new IndexOutOfBoundsException("Index: "+index);
	}
}

總結

  • 想要實現一個 支援按次序訪問的 List,只需要繼承這個抽象類,然後把指定的抽象方法實現就好了。需要實現的方法有:size、listIterator。
  • 如果要實現一個 不可修改 的 List,只需要實現Iterator的hasNext、next、hasPrevious、previous和index方法。
  • 如果要實現一個 可修改 的 List,還需要額外實現Iterator的set的方法。
  • 如果要實現一個 大小可變 的 List,還需要額外的實現Iterator的remove和add方法
  • AbstractSequentialList 只支援迭代器按順序 訪問,不支援 RandomAccess,所以遍歷 AbstractSequentialList 的子類,使用for迴圈+get() 的效率 要 <= 迭代器遍歷

相關文章