我在学习Java的集合之间遇到了一个问题,就是像ArrayList这样的某些类也实现了 RandomAccess ,而有些类则没有。我想知道为什么要实现此接口及其好处?如果我在课堂上使用此接口会发生什么?
答案 0 :(得分:3)
“随机访问列表”是一个列表,您可以在其中以恒定且更快的速度访问任何随机数据,而“顺序列表”则是必须依次遍历之前的所有项目以访问任何特定项目的列表。
如下面的图形图像所示,您可以看到在第一个示例中,如果要访问9,可以直接使用index获取值,而在第二个图像中,数据不能可以随机访问,并且需要通过23 -> 3 -> 17 -> 9
或42 -> 9
进行迭代,因此第二种情况下访问任何值的时间不是恒定的,并且每个值都不同。
为什么要实现RandomAccess接口?
它是JDK 1.4的一部分,是一个标记器接口,它指示实现它的类在访问列表中的任何随机数据时需要花费恒定且快速的时间。
有什么好处?
该算法的任何实现都可以检查当前列表是否是“随机访问”的子级,从而确保随机访问或顺序访问的最佳性能。
下面是一个博客中的一个很好的例子,它很好地解释了一种用法:
Object o;
if (listObject instanceof RandomAccess)
{
for (int i=0, n=list.size(); i < n; i++)
{
o = list.get(i); // directly get the object as list implements Random access
//do something with object o
}
}
else
{
Iterator itr = list.iterator();
for (int i=0, n=list.size(); i < n; i++)
{
o = itr.next(); // Use iterator to get values sequentially as random access
// is not fast for this list and hence does not implement RandomAccess
//do something with object o
}
}
如果我在课堂上使用此接口会发生什么?
当您实现任何其他标记接口时,也会发生相同的情况。它只是给其他类一个指示,因为实现它的类可以期望什么。
您也可以参考Java docs来了解更多信息。
答案 1 :(得分:2)
RandomAccess
是标记界面。它没有任何方法。
其标记ArrayList
表示它支持随机访问O(1)
给定索引中的任何值。
LinkedList
不 提供O(1)
随机访问其元素的权限,因为其具有双向链接列表(因此O(n)
的随机访问复杂度)。因此,将RandomAccess
用于LinkedList
没有意义。可以对没有实现 Collection
的其他RandomAccess
类给出相同的推理。
我想知道为什么要实现此接口及其功能 受益吗?
Java收集框架使用此接口优化性能。
直接使用文档:
根据经验,List实现应该实现 接口,对于该类的典型实例,是否存在以下循环:
for (int i=0, n=list.size(); i < n; i++) list.get(i);
运行速度快于此循环:
for (Iterator i=list.iterator(); i.hasNext(); ) i.next();
另请参见this javadoc here,其中进行了详细说明。