ArrayList
реализует интерфейс RandomAccess
. Интерфейс RandomAccess
не имеет методов. Когда я проверил LinkedList
, он не реализует интерфейс RandomAccess
.
Итак, в случае ArrayList
, в чем смысл его реализации?
ArrayList
реализует интерфейс RandomAccess
. Интерфейс RandomAccess
не имеет методов. Когда я проверил LinkedList
, он не реализует интерфейс RandomAccess
.
Итак, в случае ArrayList
, в чем смысл его реализации?
Интерфейсы без методов называются интерфейсами маркеров в 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
Интерфейс RandomAccess не имеет метода
Это называется интерфейсом маркера и является шаблоном проектирования, который называется шаблоном интерфейса маркера.
Когда я проверил LinkedList, он не реализует интерфейс RandomAccess. Итак, в случае ArrayList, какой смысл его реализовать?
Поскольку произвольный доступ в LinkedList
равен O (n), а O (1) - в ArrayList
.
Это указано в doc:
Лучшие алгоритмы управления списками произвольного доступа (например, ArrayList) может создавать квадратичное поведение при применении к последовательным списки доступа (например, LinkedList)
Это довольно хорошо описано в документации: 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();
1) Существуют два класса, которые реализуют интерфейс RandomAccess
. Это:
ArrayList (Part of List<I>)
Vector (Part of List<I>)
2) Цель интерфейса RandomAccess
- получить любой случайный элемент в коллекции с той же скоростью. Пример. У меня есть коллекция из 1 миллиона объектов. Внедрение интерфейса RandomAccess
делает ваше время для извлечения 10-го элемента и 17869-го элемента одинаковым. Это делает ArrayList
и Vector
более мощными.
3) RandomAccess
Интерфейс не имеет методов или полей и также называется интерфейсом маркера. Они используются, чтобы указать что-то компилятору, другими словами, реализация этих интерфейсов подразумевает особое отношение к классу реализации.
Посмотрите, как вы можете практически использовать этот интерфейс маркера. Сначала соответствующие части из 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();
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
Интерфейс RandomAccess означает эффективный случайный доступ к элементам Collection.
В коде клиента вы можете проверить, является ли коллекция экземпляром RandomAccess, а затем выполнять операции произвольного доступа.
Доступ к элементам из LinkedList и ArrayList можно получить случайным образом, однако сложность ArrayList равна O (1), а LinkedList - O (n).
Интерфейс не имеет методов (интерфейс 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
}