OpenJDK源码研究笔记(三)-RandomAccess等标记接口的作用
来源:互联网 发布:开淘宝店铺挣钱吗 编辑:程序博客网 时间:2024/04/27 13:45
标识接口是没有任何方法和属性的接口。
它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。
下面来看一个标记接口RandomAccess。
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();
OpenJDK源码 java.util.Collections
public static void shuffle(List<?> list, Random rnd) {
int size = list.size();
if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
for (int i = size; i > 1; i--)
swap(list, i - 1, rnd.nextInt(i));
} else {
Object arr[] = list.toArray();
// Shuffle array
for (int i = size; i > 1; i--)
swap(arr, i - 1, rnd.nextInt(i));
// Dump array back into list
ListIterator it = list.listIterator();
for (int i = 0; i < arr.length; i++) {
it.next();
it.set(arr[i]);
}
}
}
如果List集合实现了RandomAccess标记接口,表明该List可以随机访问。这样访问List中的第i个元素(任意一个)时间是一个常量。
如果没有实现,访问第i个元素list.get(i)的会花费更多的时间。
为了节省时间,先将list转换为“数组”,再对“数组”进行 随机访问,最后将“数组”转换为list。
JDK中文API文档对标记接口RandomAccess的说明和OpenJDK源码中的这个例子是值得我们去学习的。
参考资料: OpenJDK源码,JDK中文API文档
相关阅读:http://blog.csdn.net/fansunion/article/category/1686259
原文参见:http://FansUnion.cn/articles/2828
- OpenJDK源码研究笔记(三)-RandomAccess等标记接口的作用
- 关于RandomAccess接口的研究
- 关于RandomAccess接口的研究
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类
- jdk源码三 RandomAccess接口用法
- OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
- 集合类--关于RandomAccess接口的研究
- OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
- RandomAccess接口的使用
- RandomAccess接口的使用
- RandomAccess接口的使用
- RandomAccess接口的使用
- OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)
- OpenJDK源码研究笔记(十一):浅析Javac编译过程中的抽象语法树(IfElse,While,Switch等语句的抽象和封装)
- OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)
- OpenJDK源码研究笔记(一)-参数检查&抛出带关键错误提示信息的异常
- OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法
- OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构
- 【重点】内部类初始化以及访问外部类变量
- 测试
- 你不可能让所有人都喜欢你
- XCODE5中关闭ARC的方法
- inux下的快捷方式图标
- OpenJDK源码研究笔记(三)-RandomAccess等标记接口的作用
- 解决cocos2d-x 2.1.4以后的添加项目问题
- Linux重修笔记------cut
- 管理 一
- Daily Words Enforcement
- ssh框架注册乱码问题
- java自学笔记之循环 第三天
- hdu 4418
- 一条SQL实现数据分摊