Что в основном представляет собой RandomAccess? Почему мы используем RandomAccess? - PullRequest
0 голосов
/ 04 июля 2018

Я изучал коллекции в java между тем, я застрял в точке, что некоторые классы, такие как ArrayList, реализуют RandomAccess , в то время как некоторые классы этого не делают. Я хочу знать, почему этот интерфейс реализован и в чем его выгода? Что произойдет, если я буду использовать этот интерфейс в своем классе?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

RandomAccess - это маркер интерфейса . В нем нет никаких методов. Его отметки ArrayList показывают, что он поддерживает произвольный доступ к любому значению в O(1) заданном индексе.

LinkedList, с другой стороны, не не обеспечивает O(1) произвольный доступ к его элементам, поскольку он поддерживается двусвязным списком (следовательно, O(n) random сложность доступа). Следовательно, не имеет смысла использовать RandomAccess для LinkedList. То же самое можно сказать и для других Collection классов, которые не реализуют RandomAccess.

Я хочу знать, почему этот интерфейс реализован и каков его польза?

Каркас коллекции Java использует этот интерфейс для оптимизации производительности .

Прямо из документов:

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

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

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

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

Также см. этот javadoc здесь , который прекрасно объясняет это.

0 голосов
/ 04 июля 2018

Список произвольного доступа против последовательного списка

Список произвольного доступа - это список, в котором вы можете получить доступ к любым случайным данным в постоянном и более быстром темпе, тогда как в последовательном списке вам нужно последовательно выполнять итерации по всему элементу перед ним, чтобы получить доступ к любому конкретному элементу.

Как и на приведенном ниже графическом изображении, вы можете видеть, что в первом примере, если вы хотите получить доступ к 9, вы можете напрямую получить значения, используя индекс, тогда как на втором изображении данные не могут быть доступ случайный и должен повторяться через 23 -> 3 -> 17 -> 9 или 42 -> 9, и, следовательно, время доступа к любому значению во втором случае не является постоянным и отличается для каждого значения.

enter image description here

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

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

В чем выгода?

Любая реализация алгоритма может проверить, является ли текущий список дочерним элементом произвольного доступа, и, соответственно, обеспечить наилучшую производительность для произвольного доступа или последовательного доступа.

Ниже приведен один замечательный пример из одного блога, который объясняет один из способов использования:

Object o;
if (listObject instanceof RandomAccess)
{
  for (int i=0, n=list.size(); i < n; i++)
  {
    o = list.get(i); // directly get the object as list implements Random access
    //do something with object o
  }

}
else
{
  Iterator itr = list.iterator();
  for (int i=0, n=list.size(); i < n; i++)
  {
    o = itr.next(); // Use iterator to get values sequentially as random access 
                    //  is not fast for this list and hence does not implement RandomAccess
    //do something with object o

  }
}

Что бы произошло, если бы я использовал этот интерфейс в своем классе?

То же самое произойдет, как и при реализации любого другого интерфейса маркера Он просто указывает другому классу, что можно ожидать от класса, реализующего его.

Вы также можете обратиться к Java документам , чтобы узнать больше об этом.

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