Я хотел бы обсудить немного производительности конкретной коллекции, LinkedHashMap, для конкретного требования и как новые функции Java 8 или 9 могут помочь в этом.
Предположим, у меня есть следующая LinkedHashMap:
private Map<Product, Item> items = new LinkedHashMap<>();
Использование конструктора по умолчанию означает, что эта Карта следует порядку вставки, когда она повторяется.
- EDITED--
Просто чтобы прояснить это, я понимаю, что Карты не являются правильной структурой данных, к которой должен обращаться индекс, бывает, что этому классу на самом деле нужны два метода удаления, один по Product, правильный путь, который является ключом, и другой по позиции, или по индексу, что не часто, так что я беспокоюсь о производительности. Кстати, это не мое требование.
Мне нужно реализовать метод removeItem () по индексу . Для тех, кто не знает, LinkedHashMap не имеет какой-либо метод map.get(index);
.
Итак, я перечислю пару решений:
Решение 1:
public boolean removeItem(int position) {
List<Product> orderedList = new ArrayList<>(items.keySet());
Product key = orderedList.get(position);
return items.remove(key) != null;
}
Решение 2:
public boolean removeItem(int position) {
int counter = 0;
Product key = null; //assuming there's no null keys
for(Map.Entry<Product, Item> entry: items.entrySet() ){
if( counter == position ){
key = entry.getKey();
break;
}
counter++;
}
return items.remove(key) != null;
}
Соображения по поводу этих 2 решений.
S1: Я понимаю, что ArrayLists имеют быструю итерацию и доступ, поэтому я считаю, что проблема заключается в том, что создается целая новая коллекция, поэтому память будет скомпрометирована, если у меня будет огромная коллекция.
S2: Я понимаю, что итерация LinkedHashMap быстрее, чем HashMap, но не так быстро, как ArrayList, поэтому я считаю, что время итерации здесь будет скомпрометировано, если у нас будет огромная коллекция, но не память.
Учитывая все это и мои соображения верны, могу ли я сказать, что оба решения имеют O (n) сложность?
Есть ли лучшее решение для этого случая с точки зрения производительности, используя последние функции Java 8 или 9?
Ура!