Java 中的随机访问接口

在编程领域,高效的数据操作通常是一项关键要求。Java 作为最流行的编程语言之一,提供了各种工具和接口来帮助有效地实现这一目标。其中一个接口是RandomAccess 接口,它在实现对数据结构的随机访问方面发挥着至关重要的作用。在本节中,我们将深入了解 Java 中的随机访问世界,探讨 RandomAccess 接口是什么、它是如何工作的,并提供实际示例来说明其用法。

RandomAccess 接口是 Java 中的标记接口,这意味着它不声明自己的任何方法。相反,它充当标记来指示实现它的类支持高效的随机访问操作。通过实现此接口,类本质上告诉 Java 它可以提供对元素的更快访问,通常使用索引或键。

使用 RandomAccess 接口的主要原因是表明类已针对随机访问优化了其数据结构。此信息对于依赖于高效随机访问的算法和数据结构可能是有益的。当一个类实现 RandomAccess 时,它表明通过索引或键访问元素之类的操作将快速高效。

  • 随机访问列表是一个列表,您可以在其中以恒定且更快的速度访问任何随机数据,
  • 而顺序列表是您必须顺序迭代之前的所有项目,才能访问任何特定项目。

ArrayList vs. LinkedList

  • RandomAccess是一个表明数据结构具有快速检索时间的接口。对于 ArrayList,如果我们调用 ArrayList.get(x),则获取位置 x 处的元素所需的时间非常快(运行时间为 O(1))。
  • LinkedList不实现 RandomAccess。如果我们调用 LinkedList.get(x),检索该元素将花费相当长的时间(O(n) 运行时间)。使用for没有意义

根据JDK文档,实现了随机接口以后,使用get方法要快:

  for (int i=0, n=list.size(); i < n; i++)
         list.get(i);
 

上面循环比下面快:
   
 for (Iterator i=list.iterator(); i.hasNext(); )
         i.next();


案例
假设我们有一个很大的数据列表,并且我们希望经常访问随机索引处的元素。如果用于存储此列表的数据结构实现 RandomAccess 接口,那么与非 RandomAccess 数据结构相比,我们可以预期更快的性能。

在此示例中,我们将创建一个实现 RandomAccess 接口的自定义类,以有效地存储整数列表。然后我们将比较有接口和没有接口的随机访问性能。

import java.util.ArrayList;  
import java.util.List;  
import java.util.RandomAccess;  
// 定义一个实现 RandomAccess 接口的自定义类  ;
class CustomList implements RandomAccess {  
    private List<Integer> data;  
   
// Constructor to initialize the data list  
    public CustomList() {  
        data = new ArrayList<>();  
    }  
   
// Method to add an element to the custom list  
    public void add(int element) {  
        data.add(element);  
    }  
   
// Method to get an element at a specified index  
    public int get(int index) {  
        return data.get(index);  
    }  
}  
// Main class to demonstrate random access with CustomList  
public class RandomAccessDemo {  
    public static void main(String[] args) {  
       
// Create an instance of CustomList  
        CustomList customList = new CustomList();  
       
// 用 100 万个整数填充自定义列表  ;
        for (int i = 0; i < 1000000; i++) {  
            customList.add(i);  
        }  
       
// Measure the start time  
        long startTime = System.nanoTime();  
       
// 使用随机索引访问元素  ;
        for (int i = 0; i < 100000; i++) {  
           
// 在自定义列表范围内生成随机索引 
            int index = new Random().nextInt(1000000);  
           
// 读取随机索引的元素;
            customList.get(index);  
        }  
       
// Measure the end time  
        long endTime = System.nanoTime();  
       
// Calculate the duration (time taken)  
        long duration = endTime - startTime;  
       
// Print the time taken with RandomAccess  
        System.out.println(
"Time taken with RandomAccess: " + duration + " ns");  
    }  
}  

在此程序中,我们创建一个实现 RandomAccess 接口的 CustomList 类。我们用一百万个整数填充它,然后使用 get 方法访问随机索引处的元素。我们测量这些随机访问操作所花费的时间。

现在,让我们比较一下使用和不使用 RandomAccess 接口的随机访问性能。

确切的时间值取决于计算机的性能,但您应该观察到使用 RandomAccess 时的访问时间比不使用时要快

这证明了在处理支持高效随机访问的数据结构时使用 RandomAccess 接口的优势。

结论
Java 中的 RandomAccess 接口是优化数据结构随机访问操作的强大工具。通过实现此接口,类表明它们旨在提供对其元素的有效访问,使它们非常适合在随机访问是常见要求的场景中使用。理解和利用 RandomAccess 接口可以显着提高 Java 应用程序的性能,尤其是在处理大型数据集或频繁访问的集合时。