我正在读书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(使用前将#替换为@)