RandomAccess
마커 인터페이스의 원래 목적을 기억해야합니다. List
을 다른 방법으로 전달하면 임의 액세스 또는 순차적 목록에 적합한 알고리즘을 선택할 수 있어야합니다. 올바른 알고리즘을 선택하려면 list instanceof RandomAccess
을 통해 마커 인터페이스를 테스트해야합니다.
방금, 이러한 모든 방법을 볼 수있는 List
인터페이스를 구현하는 다른 객체로 목록을 포장하는 경우 one example
public static <T>
int binarySearch(List<? extends Comparable<? super T>> list, T key) {
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key);
else
return Collections.iteratorBinarySearch(list, key);
}
는 지금
(또한 reverse
, shuffle
, copy
및 fill
참조) 표시하려면 , 래퍼 개체이므로이 정보는 손실됩니다. 그러나 동기화 된 목록과 같은 래퍼는 get
과 같은 임의 액세스 방법의 시간 복잡도를 변경하지 않습니다. 따라서 래핑 된 목록이 임의 액세스 목록 인 경우 래퍼는 RandomAccess
도 구현해야하므로 이러한 래퍼를 수신하는 메서드는 빠른 임의 액세스를 사용할 수 있는지 여부를 여전히 감지 할 수 있습니다.
당신이 implementation of SynchronizedRandomAccessList
보면, 당신이하지 모두가 SynchronizedList
을 확장하고 동작을 상속, RandomAccess
구현 및 빠른 랜덤 액세스를 필요로 자신을 표시되는 것을 볼 수 있습니다. 재정의하는 유일한 방법은 정확히 같은 이유로 subList
입니다. 목록에 효율적인 무작위 액세스가있는 경우 해당 하위 목록도 있으므로 RandomAccess
도 구현해야합니다. checkedList
같은 다른 래퍼 공장 같은 패턴을 따르는 것이
는
static class SynchronizedRandomAccessList<E>
extends SynchronizedList<E>
implements RandomAccess {
SynchronizedRandomAccessList(List<E> list) {
super(list);
}
SynchronizedRandomAccessList(List<E> list, Object mutex) {
super(list, mutex);
}
public List<E> subList(int fromIndex, int toIndex) {
synchronized (mutex) {
return new SynchronizedRandomAccessList<>(
list.subList(fromIndex, toIndex), mutex);
}
}
참고. 거짓
문자열 객체를 상속 → 진정한
→
당신이 더 String 클래스가 없어야 의미 생각 ... : 공장을 결합 할 때 그래서 심지어 작동? – Stultuske
특정의'List' 구현이 마커 인터페이스'RandomAccess'를 구현하고 있기 때문에 효율적인 랜덤 액세스를 제공하는리스트 구현에 대해보다 효율적일 수있는'SynchronizedRandomAccessList'를 반환해야합니다. 리스트가 랜덤 액세스를 제공하지 않으면'SynchronizedList'가 사용되어야합니다. – Jesper
@ Stultuske 내 질문에 왜 우리는 instanceof 체크 –