Сравнение эффективности цикла - PullRequest
1 голос
/ 13 марта 2012

Что из этого более эффективно?:

ArrayList<Integer> list = new ArrayList<Integer>();
for(int a : list){
   log.i(tag, a + "");
}

SparseIntArray list2 = new SparseIntArray();
int count = list2.size();
for(int j = 0; j < count; j++) {
   log.i(tag, list2.get(j) + "");
}

Или есть ли более быстрый способ чтения содержимого списка?

Ответы [ 3 ]

15 голосов
/ 13 марта 2012

Эффективность, в данном случае, не имеет значения, поскольку эти двое делают совершенно разные вещи.

Я думаю, вы понимаете, что ваш ArrayList пример повторяет все элементы массива-списка.

Что вы не понимаете, так это то, что ваш SparseIntArray пример не выполняет итерацию по всем элементам массива sparse-integer, потому что ключи массива sparse-integer делают не диапазон от нуля до размера-массива-минус один. Скорее, его ключи являются произвольными целыми числами. Массив разреженных целочисленных значений имеет столько же общего интерфейса, с HashMap<Integer, Integer>, чем с ArrayList<Integer>.

(Кстати, это относится к общему правилу разработки программного обеспечения: лучше, чтобы ваш код был правильный , чем эффективный . Вы всегда можете взять правильный, чистый кодируйте и находите способы улучшить его производительность, но очень сложно быстро взять код с ошибками и найти способы исправить его.)

2 голосов
/ 13 марта 2012

SparseIntArrays отображать целые числа в целые числа.В отличие от обычного массива целых чисел, в индексах могут быть пробелы.Предполагается, что он более эффективен, чем использование HashMap для отображения целых чисел в целые числа.

Подробнее

2 голосов
/ 13 марта 2012

Циклы For-each, как в первом примере, почти всегда предпочтительнее, когда вам не нужны переменные индекса по другим причинам.

Редактировать: ArrayLists будет выполнять итерацию более эффективно (в вашем примере, многократно вызывая "get"), чем SparseIntArray, потому что поиски имеют постоянное время, а не логарифмическое время. Это будет немного зависеть от вашего варианта использования - если ваши ключи редки, то SparseIntArray сэкономит вам много места в памяти.

Я хотел бы отметить, что SparseIntArray может иметь пробелы в индикаторах, что означает, что циклическое перемещение по каждому значению от 0 до размера не только неэффективно, но также будет возвращать 0 для каждого отсутствующего индекса, что, вероятно, не является вашим предполагаемым поведением .

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