Java 随机访问接口,为什么没有方法?

Java 随机访问接口,为什么没有方法?,java,collections,random-access,Java,Collections,Random Access,我正在阅读,然后看了看: 列表实现使用的标记接口,用于指示 支持快速(通常为固定时间)随机访问。[……] 我想知道为什么这个接口(比如Serializable)没有方法?设计原因是什么 即使只列出“实现”这个接口,为什么不将Eget()设置为一个方法呢?我知道不是每个列表都是随机访问的,但是如果没有方法,我如何使用这个接口呢 大概是这样的: if(object instanceof RandomAccess){ // should I cast it if no operations c

我正在阅读,然后看了看:

列表实现使用的标记接口,用于指示 支持快速(通常为固定时间)随机访问。[……]

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

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

大概是这样的:

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

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

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

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

人们可以争论这是否是一个好的设计决策。例如,可以从列表中删除随机访问方法(只允许迭代),并将其放置到随机访问接口中。类似地,对象序列化系统的方法也可以放在Serializable接口中

此外,只有列表可以随机访问

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

文件呢

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

标记接口是一种早于注释的技术;它意味着将一个类标记为符合某个标准,而该标准与方法无关

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

没有一种方法可以在方法名称中限定“列表的存储方式”或“不同访问模式的速度或速度”。因此,Java使用标记接口来提供这些信息

在这种情况下,ArrayList将是随机访问,而LinkedList则不是

编辑


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

正如javadoc所述,它是一个“标记”接口,根据定义,它没有方法。它标记了具有快速随机访问的列表实现,因此使用该实现的用户将知道他们使用的类已为此进行了优化。我认为拒绝获取列表不适合用于随机移动的代码(因为它已经实现了获取列表的方法)。但它可能会为链表选择不同的算法(例如,首先复制列表,或者执行不需要随机访问的算法)。我想说,对于标记接口,它与标准或契约关系不大,因为这与方法中反映的行为有关,而更多地与类的实现有关。否则答案很好。@CoryKendall我还不清楚基本概念。为什么要实现随机访问?由于连续内存和ArrayList在内部使用数组,所以即使是数组也能提供更快的访问速度,那么这应该足以让它更快,对吗?JVM是否为实现随机访问的列表做了额外的工作?