public interface RandomAccess
List 实现所使用的标记接口,用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。
将操作随机访问列表的最佳算法(如 ArrayList)应用到连续访问列表(如 LinkedList)时,可产生二次项的行为。如果将某个算法应用到连续访问列表,那么在应用可能提供较差性能的算法前,鼓励使用一般的列表算法检查给定列表是否为此接口的一个 instanceof,如果需要保证可接受的性能,还可以更改其行为。
现在已经认识到,随机和连续访问之间的区别通常是模糊的。例如,如果列表很大时,某些 List 实现提供渐进的线性访问时间,但实际上是固定的访问时间。这样的 List 实现通常应该实现此接口。实际经验证明,如果是下列情况,则 List 实现应该实现此接口,即对于典型的类实例而言,此循环:
for (int i=0, n=list.size(); i < n; i++) list.get(i);
的运行速度要快于以下循环:
for (Iterator i=list.iterator(); i.hasNext(); ) i.next();
使用标记接口可以使用类型查询,例如:
if( list instanceof RandomAccess){}
package com.java.coutClass; import java.util.Iterator; import java.util.List; import java.util.RandomAccess; public class RandomAccessClass { public static void PrintList(List list) { if (list instanceof RandomAccess) { for (int i = 0; i < list.size(); i++) { System.out.println("标记接口Random" + list.get(i)); } } else { for (Iterator it = list.iterator(); it.hasNext();) { System.out.println(it.next()); } } } }
package com.java.coutClass; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class RanTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub List<String> arr=new ArrayList<String>(); arr.add("测试标记接口@!!1"); arr.add("测试标记接口@!!2"); arr.add("测试标记接口@!!3"); RandomAccessClass.PrintList(arr); List<String> link=new LinkedList<String>(); link.add("我没有标记接口!!1"); link.add("我没有标记接口!!2"); link.add("我没有标记接口!!3"); link.add("我没有标记接口!!4"); RandomAccessClass.PrintList(link); } }
标记接口Random测试标记接口@!!1
标记接口Random测试标记接口@!!2
标记接口Random测试标记接口@!!3
我没有标记接口!!1
我没有标记接口!!2
我没有标记接口!!3
我没有标记接口!!4
这里没有计算他们的运行时间,有兴趣的同学可以自己试试。
其他类型的标记接口:
java.io.Serializable
未实现此接口的类将无法使其任何状态序列化或反序列化.为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值.
java.lang.Cloneable
表明Object.clone()方法可以合法地对该类实例进行按字段复制.实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的).如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常.
java.util.RandomAccess
用来表明其支持快速(通常是固定时间)随机访问.此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能.
java.rmi.Remote
Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口.任何远程对象都必须直接或间接实现此接口.只有在“远程接口”(扩展 java.rmi.Remote 的接口)中指定的这些方法才可远程使用.