RandomAccess 接口

由數組支持的有序集合可以快速地隨機訪問,因此適合使用List方法並提供一個整數索引來訪問。與之不同,鏈表儘管也是有序的,但是隨機訪問速度很慢,所以最好使用迭代器來遍歷。爲了避免對鏈表完成隨機訪問操作,Java SE 1.4引入了一個標記接口 RandomAccess。這個接口不包含任何方法,不過可以用它來測試一個特定的集合是否支持高效的隨機訪問:

if (c instanceof RandomAccess){
  use random access algorithm
} else {
  use sequential access algorithm
}

接口源碼:

package java.util;

/**
 * Marker interface used by <tt>List</tt> implementations to indicate that
 * they support fast (generally constant time) random access.  The primary
 * purpose of this interface is to allow generic algorithms to alter their
 * behavior to provide good performance when applied to either random or
 * sequential access lists.
 *
 * <p>The best algorithms for manipulating random access lists (such as
 * <tt>ArrayList</tt>) can produce quadratic behavior when applied to
 * sequential access lists (such as <tt>LinkedList</tt>).  Generic list
 * algorithms are encouraged to check whether the given list is an
 * <tt>instanceof</tt> this interface before applying an algorithm that would
 * provide poor performance if it were applied to a sequential access list,
 * and to alter their behavior if necessary to guarantee acceptable
 * performance.
 *
 * <p>It is recognized that the distinction between random and sequential
 * access is often fuzzy.  For example, some <tt>List</tt> implementations
 * provide asymptotically linear access times if they get huge, but constant
 * access times in practice.  Such a <tt>List</tt> implementation
 * should generally implement this interface.  As a rule of thumb, a
 * <tt>List</tt> implementation should implement this interface if,
 * for typical instances of the class, this loop:
 * <pre>
 *     for (int i=0, n=list.size(); i &lt; n; i++)
 *         list.get(i);
 * </pre>
 * runs faster than this loop:
 * <pre>
 *     for (Iterator i=list.iterator(); i.hasNext(); )
 *         i.next();
 * </pre>
 *
 * <p>This interface is a member of the
 * <a href="{@docRoot}/../technotes/guides/collections/index.html">
 * Java Collections Framework</a>.
 *
 * @since 1.4
 */
public interface RandomAccess {
}

從上述源碼可以看出,對於List接口的子類,如果:

for (int i=0, n=list.size(); i &lt; n; i++)
        list.get(i);

的訪問方式比:

for (Iterator i=list.iterator(); i.hasNext(); )
       i.next();

要快,那麼它應該實現 RandomAccess接口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章