Почему ArrayList реализует интерфейс RandomAccess?

ArrayList реализует интерфейс RandomAccess. Интерфейс RandomAccess не имеет методов. Когда я проверил LinkedList, он не реализует интерфейс RandomAccess.

Итак, в случае ArrayList, в чем смысл его реализации?

Ответ 1

Интерфейсы без методов называются интерфейсами маркеров в Java.

В соответствии с JavaDoc RandomAccess:

Интерфейс маркера, используемый реализацией списка, чтобы указать что они поддерживают быстрый (обычно постоянный) случайный доступ.

Для получения дополнительной информации проверьте две страницы JavaDoc.

http://docs.oracle.com/javase/6/docs/api/java/util/RandomAccess.html

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

Ответ 2

Интерфейс RandomAccess не имеет метода

Это называется интерфейсом маркера и является шаблоном проектирования, который называется шаблоном интерфейса маркера.

Когда я проверил LinkedList, он не реализует интерфейс RandomAccess. Итак, в случае ArrayList, какой смысл его реализовать?

Поскольку произвольный доступ в LinkedList равен O (n), а O (1) - в ArrayList.

Это указано в doc:

Лучшие алгоритмы управления списками произвольного доступа (например, ArrayList) может создавать квадратичное поведение при применении к последовательным списки доступа (например, LinkedList)

Ответ 3

Это довольно хорошо описано в документации: http://docs.oracle.com/javase/7/docs/api/java/util/RandomAccess.html

Интерфейс маркера RandomAccess, используемый списком реализации указывают на то, что они поддерживают быстрый (обычно постоянный время) произвольный доступ. Основная цель этого интерфейса - разрешить универсальные алгоритмы для изменения их поведения для обеспечения хорошей производительности когда применяется к случайным или последовательным спискам доступа. Лучший алгоритмы управления списками произвольного доступа (например, ArrayList) может приводить к квадратичному поведению при применении к последовательным спискам доступа (например, LinkedList). Алгоритмы общего списка рекомендуется проверять является ли данный список экземпляром этого интерфейса перед применением алгоритм, который обеспечивал бы низкую производительность, если бы он был применен к список последовательного доступа и изменить их поведение, если необходимо, чтобы гарантия приемлемого исполнения.

Признано, что различие между случайным и последовательным доступ часто нечеткий. Например, некоторые реализации List предоставляют асимптотически линейное время доступа, если они становятся огромными, но постоянными время доступа на практике. Такая реализация списка должна в целом реализовать этот интерфейс. Как правило, реализация списка должен реализовывать этот интерфейс, если для типичных экземпляров class, этот цикл:

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

работает быстрее, чем этот цикл:

 for (Iterator i=list.iterator(); i.hasNext(); )
     i.next();

Ответ 4

1) Существуют два класса, которые реализуют интерфейс RandomAccess. Это:

ArrayList (Part of List<I>)
Vector    (Part of List<I>)

2) Цель интерфейса RandomAccess - получить любой случайный элемент в коллекции с той же скоростью. Пример. У меня есть коллекция из 1 миллиона объектов. Внедрение интерфейса RandomAccess делает ваше время для извлечения 10-го элемента и 17869-го элемента одинаковым. Это делает ArrayList и Vector более мощными.

3) RandomAccess Интерфейс не имеет методов или полей и также называется интерфейсом маркера. Они используются, чтобы указать что-то компилятору, другими словами, реализация этих интерфейсов подразумевает особое отношение к классу реализации.

Ответ 5

Посмотрите, как вы можете практически использовать этот интерфейс маркера. Сначала соответствующие части из docs (жирные шрифты - мои, чтобы подчеркнуть).

Интерфейс маркера, используемый списком чтобы указать, что они поддерживают быстро (обычно постоянны время). Основная цель этого интерфейса - разрешить универсальные алгоритмы для изменения их поведения для обеспечения хорошей производительности когда применяется к случайным или последовательным спискам доступа. RandomAccess Интерфейс маркера, используемый реализацией списка, чтобы указать, что они поддерживать быстрый (обычно постоянный) случайный доступ. Главная Цель этого интерфейса - разрешить общие алгоритмы изменить их поведение для обеспечения хорошей производительности при применении к случайные или последовательные списки доступа. Лучшие алгоритмы для управление списками произвольного доступа (например, ArrayList) может привести к квадратичное поведение при применении к последовательным спискам доступа (например, LinkedList).

Возьмем пример. Предположим, вы пишете общую реализацию алгоритма, такого как сортировка, и вы выбираете быструю сортировку, как хотите сортировку на месте. Почему общий? Потому что, может быть, вы хотите, чтобы алгоритм мог работать с разумными и прогнозируемыми характеристиками производительности для всех видов List (есть много видов там - не). Таким образом, ваша функция алгоритма возьмите список в качестве ввода и верните тот же список, что и отсортированный. На мгновение оставьте в стороне различные факторы, которые влияют на производительность быстрой сортировки (например, уже отсортированные данные, повторяющиеся данные, правильный выбор поворота и т.д.). Помимо вышеупомянутых характеристик данных/сортировки, еще один важный момент заключается в том, что ваш алгоритм заставляет нас перебирать список - в этом случае он использует случайный доступ в значительной степени, так как ему нужно сравнивать и свопировать элементы. Итак, что вы думаете - будет ли ваш алгоритм хорошо работать на всех типах реализаций List. Подумайте о LinkedList - есть положение для произвольного доступа в API, но оно требует большого количества обходов из-за самой природы того, как данные организованы в списке, как узлы, указывающие друг на друга, и болезненный неизбежный акт прохождения большого количества узлов для получения случайного node. Таким образом, ваш общий алгоритм имеет большую изменчивость с точки зрения производительности. Что, если вы каким-то образом знаете, что некоторые списки обеспечивают быстрый доступ к ramasm, а некоторые нет. Что, если есть маркер, который так говорит. Входит интерфейс маркера "RandomAccess", который реализован (отмечен/аннотирован будет лучше) ArrayList (ваш код обычно проверяется с помощью instanceof RandomAccess теста), что он довольно быстро позволяет случайным образом получать данные, и вы можете положиться на что для написания алгоритма, который выполняет, и если какой-то список не пытается, попробуйте альтернативный алгоритм или, возможно, сначала преобразуйте его в ArrayList или, в худшем случае, отклоните такой ввод полностью.

Другая часть документа связана с тем, что считается быстрым случайным, предоставляя два разных способа доступа к базовым данным, которые легко понять. Быстрый случайный доступ означает, что первый работает быстрее, чем второй раз.

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

runs faster than this loop:
     for (Iterator i=list.iterator(); i.hasNext(); )
         i.next();

Ответ 6

RandomAccess: интерфейс маркера

java.util.RandomAccess - Начиная с JDK 1.4, члена коллекции. Недостатки: ArrayList и CopyOnWriteArrayList.

Для случайного доступа к данным (база индексов)

Интерфейс маркера, используемый реализацией List, чтобы указать, что они поддерживают быстрый (обычно постоянный) случайный доступ. Основная цель этого интерфейса - позволить универсальным алгоритмам изменять их поведение, чтобы обеспечить хорошую производительность при применении к случайным или последовательным спискам доступа.

Лучшие алгоритмы управления списками произвольного доступа (например, ArrayList) могут создавать квадратичное поведение при применении к спискам последовательного доступа (например, LinkedList).

Алгоритмы общего списка рекомендуется проверять, является ли данный список экземпляром этого интерфейса перед применением алгоритма, который обеспечивал бы низкую производительность, если бы он был применен к списку последовательного доступа, и, если необходимо, изменить их поведение, чтобы гарантировать приемлемую производительность.

Признано, что различие между случайным и последовательным доступом часто нечеткое.

Реализация List должна реализовать этот интерфейс, если для типичных экземпляров класса этот цикл:

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

runs faster than this loop:

for (Iterator i=list.iterator(); i.hasNext(); )
         i.next();

Для получения дополнительной информации см. мой блог:
http://javaexplorer03.blogspot.in/2015/07/randomaccess-java.html

Ответ 7

Интерфейс RandomAccess означает эффективный случайный доступ к элементам Collection.

В коде клиента вы можете проверить, является ли коллекция экземпляром RandomAccess, а затем выполнять операции произвольного доступа.

Доступ к элементам из LinkedList и ArrayList можно получить случайным образом, однако сложность ArrayList равна O (1), а LinkedList - O (n).

Ответ 8

Интерфейс не имеет методов (интерфейс Marker), но вы можете использовать его для проверки, поддерживает ли конкретная коллекция эффективный произвольный доступ

Collection<Integer> c = new ArrayList<Integer>();
if (c instanceof RandomAccess)
{
        System.out.println("use random access algorithm -> like ArrayList");//fast access date
}
else
{
        System.out.println("use sequential access algorithm -> like LinkedList");//fast delete data 
}