java - RandomAccess 接口(interface),为什么没有方法?

标签 java collections random-access

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

Marker interface used by List implementations to indicate that they support fast (generally constant time) random access. [...]

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

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

像这样:

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

还有,只有Lists才可以RandomAccess?文件呢?

最佳答案

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

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

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

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

编辑

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

关于java - RandomAccess 接口(interface),为什么没有方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13547789/

相关文章:

java - 如何打开和运行导出的 JAR 文件

java - LinkedList 程序无响应;可能的空指针错误

java - Equals 方法不适用于两个相同的对象

用于按需加载元素的容器的 C++ 随机访问迭代器

opengl - GPU 如何处理随机访问?

c# - CSV 随机访问; C#

Java Swing 文本框和按钮未显示在表单中?

Java Apache POI : Writing Workbook to ServletOutputStream hangs until button clicked in client browser

java - 如何获得两次之间没有时区的差异?

java - 哪个集合用于一对多类型的数据?