在java中Serializable,Cloneable,RandomAccess这些接口的内部没有任何方法,但是实现了这些接口以后便可以序列化,拷贝以及判断集合是否能快速访问。原因是应为这些接口都是标记接口,它们的功能就是标记实现给接口的类拥有对应的功能。

实现标记接口以后就相当于告诉JVM虚拟机实现该接口的类具有了相应的功能。

java.util.RandomAccess接口

List 实现所使用的标记接口, 用来表明其支持快速(通常是固定时间)随机访问。此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。

将操作随机访问列表的最佳算法(如 ArrayList )应用到连续访问列表(如 LinkedList )时,可产生二次项的行为。如果将某个算法应用到连续访问列表,那么在应用可能提供较差性能的算法。(随机访问列表)如ArrayList 要实现此接口,Sequence Access List(顺序访问列表)如LinkedList不要实现,因为两者高效遍历算法不同。

实现了RandomAccess接口的list最好不要使用迭代器遍历,因为这样遍历的效果会差一些,而像LinkedList这些没有实现RandomAccess接口的连续访问列表最好使用迭代器遍历,在选择遍历方式之前可以根据instanceof判断list是否实现了RandomAccess。

if (list instanceof RandomAccess) {
for(int m = 0,length = list.size(); m < length; m++){}
}else{
Iterator it = list.iterator();
while(it.hasNext()){
it.next();
}
}

java.lang.Cloneable接口

表明Object.clone()方法可以合法地对该类实例进行按字段复制.实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常。

java.io.Serializable接口

未实现此接口的类将无法使其任何状态序列化或反序列化.为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。

java.rmi.Remote接口

Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口.任何远程对象都必须直接或间接实现此接口。只有在“远程接口”(扩展 java.rmi.Remote 的接口)中指定的这些方法才可远程使用。