RandomAccess接口,为什么没有方法?

2024-04-22

我正在读书Collections.shuffle(List) javadoc http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#shuffle%28java.util.List%29然后看了一下随机访问 javadoc http://docs.oracle.com/javase/7/docs/api/java/util/RandomAccess.html:

List 实现使用标记接口来指示它们 支持快速(通常是恒定时间)随机访问。 [...]

我想知道为什么这个接口(如 Serialized)没有方法?这样做的设计原因是什么?

即使只Lists“实现”这个接口,为什么不设置Eget()作为一种方法?我知道并不是每个列表都是随机访问的,但是如果没有方法我如何使用这个接口?

像这样的东西:

if(object instanceof RandomAccess){
    // should I cast it if no operations can be done? why?
}

另外,只有列表可以随机访问吗?文件呢?


“标记”接口是一种早于注释的技术;它的目的是将类标记为符合某些标准,其中该标准与方法无关。

在这种情况下,Shuffle 在不支持快速随机访问的列表上可能会有不同的行为。考虑如何打乱链表;这很难,对吧?您不能只说“给我一个随机元素”而不遍历列表,跟随指向下一个元素的指针。现在将其与 ArrayList 进行对比。由于列表的存储方式,获取随机元素要容易得多。

没有办法在方法名称中限定“列表的存储方式”或“不同的访问模式可能有多快或多慢”。因此,Java 使用标记接口来提供此信息。

在这种情况下,ArrayList 将是 RandomAccess,而 LinkedList 则不是。

EDIT

那些对标记接口和标记注释之间的差异感兴趣的人会喜欢 Joshua Bloch 所著的《Effective Java》第二版中的第 37 条:“使用标记接口来定义类型”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RandomAccess接口,为什么没有方法? 的相关文章