Сравнение двух LinkedList <Строка> с ListIterator по сравнению с для цикла и добирается (международный индекс)

У меня есть два объекта LinkedList, которые всегда имеют тот же размер. Я хочу сравнить их, чтобы видеть, идентичны ли они в содержании. Какова общая производительность и разрабатывает последствия создания ListIterator для каждого списка и использования некоторое время hasNext цикл по сравнению с использованием счетчика (интервал i) и итерация от 0 до linkedlist.size () использующий linkedlist.get (i), чтобы получить и сравнить значения? Существует ли лучший способ, которым я пропускаю?

Единственная вещь, о которой я могу думать, состоит в том, что метод ListIterator может быть лучше в этом, я мог более легко загрузить другой Сопоставимый список позже (не, что я планирую его). Я не знаю то, на что эти два похожи под капотом, таким образом, я не уверен, как я сравнил бы их мудрый производительностью.

7
задан msilver 24 February 2010 в 03:29
поделиться

3 ответа

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

Можете ли Вы быстрее воспроизвести проблему, если:

  • Вы уменьшите объем памяти, доступной для JVM?
  • Вы уменьшите объем доступных системных ресурсов (т.е. истощите системную память, чтобы JVM не хватило)
  • Вы сменили варианты использования на более простую модель?

Одна из основных стратегий, которую я использовал, состоит в том, чтобы определить, какой случай использования вызывает проблему. Возможно, это общая проблема или вариант использования. Попробуйте зарегистрировать начало и остановку сценариев использования, чтобы узнать, какие сценарии использования могут вызвать проблему. Если вы разделяете сценарии использования пополам, посмотрите, какая половина выходит из строя быстрее всего. Это, вероятно, будет более частой причиной сбоя. Естественно, выполнение нескольких испытаний каждой конфигурации повысит точность измерений.

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

Удачи, Иаков

-121--3147254-

Мне удалось получить адрес из протокола SSDP, отправив UDP-пакет в поисках типа услуги «urn:schemas-upnp-org:device:InternetGatewayDevice:1» и отметив первое устройство (если оно есть), которое отвечает (игнорируя полезную нагрузку, так как требуется только IP-адрес шлюза).

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

Поскольку это специальное приложение для iPhone (только собственное), я собираюсь пойти с этим. Я не отмечу это как «ответ», потому что это не решение общего назначения. Если я вернусь к этому и поищу решение общего назначения (например, с помощью ICMP) или придумаю, как использовать API конфигурации iPhone SDK для запроса этой информации, я выложу здесь.

-121--4407311-

Как оказалось, AbstractList.equals () (который использует LinkedList ) сделает это автоматически, чтобы использовать это. Код:

public boolean equals(Object o) {
  if (o == this)
    return true;
  if (!(o instanceof List))
    return false;

  ListIterator<E> e1 = listIterator();
  ListIterator e2 = ((List) o).listIterator();
  while (e1.hasNext() && e2.hasNext()) {
    E o1 = e1.next();
    Object o2 = e2.next();
    if (!(o1 == null ? o2 == null : o1.equals(o2)))
      return false;
  }
  return !(e1.hasNext() || e2.hasNext());
}

Так что не изобретайте колесо заново.

Последнее замечание: не используйте get (index) для итерации по списку LinkedList . Это O (n) доступ (O (1) для ArrayList ), поэтому LinkedList обход с использованием get (index) будет O (n 2 ).

7
ответ дан 6 December 2019 в 19:36
поделиться

Произвольный доступ к LinkedList имеет ужасную производительность (он должен начинаться с одного конца и вызывать на следующем или подобное неоднократно), поэтому ListIterator будет быстрее.

5
ответ дан 6 December 2019 в 19:36
поделиться

get (n) для связанных списков не является постоянной операцией для классов, расширяющих AbstractSequentialList ; это O (n) . From AbstractSequentialList # get (int index) :

Эта реализация сначала получает итератор списка, указывающий на индексированный элемент (с listIterator (index) ). Затем он получает элемент, используя ListIterator.next , и возвращает его.

Обычно вы не хотите делать произвольный доступ к коллекциям, которые не реализуют интерфейс маркера java.util.RandomAccess .

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

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

выполняется быстрее, чем этот цикл:

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

Начиная с Java SE 6, реализующими классами являются ArrayList, AttributeList, CopyOnWriteArrayList, RoleList, RoleUnresolvedList, Stack, Vector .

1
ответ дан 6 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: