ответ будет зависеть! в области ключей. Существуют ситуации, когда хранение ключей в отсортированном порядке (то есть в дереве) очень эффективно. Однако я бы предположил, что в большинстве случаев будет более эффективным сортировать один раз, при извлечении.
Я попытался следующий код:
Map<Integer, Integer> map = new HashMap<>();
Random random = new Random();
random.ints(1000000).forEach(n -> map.put(n, n));
long time1 = System.currentTimeMillis();
Set<Integer> set = new TreeSet<>(map.keySet());
List<Integer> list1 = new ArrayList<>(set);
long time2 = System.currentTimeMillis();
List<Integer> list2 = new ArrayList<>(map.keySet());
Collections.sort(list2);
long time3 = System.currentTimeMillis();
System.out.println("Set approach " + (time2 - time1));
System.out.println("Sort approach " + (time3 - time2));
Результат был 3768 и 1824, которые я подозреваю, что будет довольно типичным для двух подходов.
По сути интереса я также пытался:
List<Integer> list3 = map.keySet().stream().sorted().collect(Collectors.toList());
Результат был 537 миллисекунды: более чем в 3 раза быстрее, чем Collections.sort
подход.
Однако, когда я повторен с 10 миллионов записей, три подхода принял
- 26,916 для
TreeSet
- 2845 для
Collection.sort
- 13,580 для
Stream.sorted
Сделан вывод о том, что сортировке массив один раз намного эффективнее для больших карт.
http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java или http: // stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java –
Почему не 'Список foo (Карта map)'? –
Это вопрос хакерранка. Итак, я не могу изменить API – ojas