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

时间:2012-11-25 02:35:51

标签: java collections random-access

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

  

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

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

即使只有列表“实现”此界面,为什么不将E get()设置为方法?我知道并非每个列表都是随机访问,但如果没有方法,我怎么能使用这个接口?

这样的事情:

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

此外,只有列表可以是RandomAccess吗?文件怎么样?

2 个答案:

答案 0 :(得分:10)

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

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

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

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

修改

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

答案 1 :(得分:1)

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

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

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

  

此外,只有列表可以是RandomAccess吗?

我猜这个界面也可以用于其他事情,但看起来它只是目前被列表使用。

  

文件怎么样?

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