3

我正在阅读Collections.shuffle(List) javadoc,然后查看了RandomAccess javadoc

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

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

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

像这样的东西:

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

另外,只有Lists可以是RandomAccess吗?文件呢?

4

2 回答 2

10

“标记”接口是一种早于注释的技术;它旨在将 Class 标记为符合某个标准,而该标准与方法无关。

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

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

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

编辑

那些对标记接口和标记注释之间的区别感兴趣的人会喜欢 Joshua Bloch 在 Effective Java 2nd Edition 中的 Item 37:“使用标记接口定义类型”。

于 2012-11-25T02:38:34.443 回答
1

这是一个标记界面。它定义了不使用任何额外方法的行为或能力。

在这种情况下,它表示随机访问(已经在 List 接口中定义)不仅是可能的,而且是有效的。使用 List 的代码可以根据这个在算法之间切换。

人们可以争论这是否是一个好的设计决策。例如,随机访问方法可能已从 List 中删除(只允许迭代),而是放入 RandomAccess 接口中。同样,对象序列化系统的方法也可以放在 Serializable 接口中。

另外,只有Lists可以是RandomAccess吗?

我猜这个接口也可以用于其他用途,但看起来它目前只被 Lists 使用。

文件呢?

随机访问文件有一个单独的机制 (java.io.RandomAccessFile)。

于 2012-11-25T02:38:21.377 回答