2012-07-12 14 views
5

Trong tài liệu java của lớp RandomAccess đã viết rằng "Giao diện đánh dấu được sử dụng bởi việc triển khai Danh sách để chỉ ra rằng chúng hỗ trợ truy cập ngẫu nhiên nhanh (thường liên tục). thuật toán chung để thay đổi hành vi của chúng để cung cấp hiệu suất tốt khi được áp dụng cho danh sách truy cập ngẫu nhiên hoặc tuần tự. "Hoạt động của RandomAccess trong AbstractList.java

nhưng tôi tìm thấy một số điều kỳ lạ

này là phương pháp sublist trong AbstractList.java trong gói java.util

public List<E> subList(int fromIndex, int toIndex) { 
    return (this instanceof RandomAccess ? 
      new RandomAccessSubList<>(this, fromIndex, toIndex) : 
      new SubList<>(this, fromIndex, toIndex)); 
} 

Thực hiện RandomAccessSubList lớp:

class RandomAccessSubList<E> extends SubList<E> implements RandomAccess { 
    RandomAccessSubList(AbstractList<E> list, int fromIndex, int toIndex) { 
     super(list, fromIndex, toIndex); 
    } 

    public List<E> subList(int fromIndex, int toIndex) { 
     return new RandomAccessSubList<>(this, fromIndex, toIndex); 
    } 
} 

sublist lớp thực hiện :

SubList(AbstractList<E> list, int fromIndex, int toIndex) { 
    if (fromIndex < 0) 
     throw new IndexOutOfBoundsException("fromIndex = " + fromIndex); 
    if (toIndex > list.size()) 
     throw new IndexOutOfBoundsException("toIndex = " + toIndex); 
    if (fromIndex > toIndex) 
     throw new IllegalArgumentException("fromIndex(" + fromIndex + 
              ") > toIndex(" + toIndex + ")"); 
    l = list; 
    offset = fromIndex; 
    size = toIndex - fromIndex; 
    this.modCount = l.modCount; 
} 

và tôi nghĩ rằng trong lớp AbstractList, RandomAccessSubList là vô ích, bởi vì nó đi dữ liệu của nó đến lớp sublist, và hoạt động của nó là như

new SubList<>(this, fromIndex, toIndex)); 

trong phương pháp sublist

Trả lời

5

Kể từ khi danh sách gốc là nhanh khi truy cập vào các chỉ số ngẫu nhiên, danh sách con cũng nhanh khi thực hiện nó, do đó, nó cũng có ý nghĩa để đánh dấu danh sách con là RandomAccess.

Danh sách phụ và RandomAccessSubList chia sẻ cùng một triển khai thông qua kế thừa, nhưng không được đánh dấu là RandomAccess và phương thức kia không được đánh dấu là RandomAccess. Đó là lý do tại sao một lớp con rất hữu ích.

+0

có, nhưng tại sao hai triển khai lại giống nhau? – Pooya

+5

Vì vậy, người ta có thể được đánh dấu là 'RandomAccess' và người kia thì không. Điều này có thể giúp các hoạt động như 'Collections.binarySearch' xác định thuật toán nào hiệu quả hơn để sử dụng cho một danh sách với các đặc tính hiệu suất này. –

+0

Tôi vẫn chưa rõ khái niệm cơ bản. Tại sao phải triển khai RandomAccess? Ngay cả Array cung cấp truy cập nhanh hơn vì bộ nhớ tiếp giáp và ArrayList sử dụng nội bộ mảng, thì điều đó phải đủ để làm cho nó nhanh hơn, tôi có đúng không? JVM có làm gì thêm cho các danh sách thực hiện RandomAccess không? – AKS

Các vấn đề liên quan