Я не думаю, что вы будете быстрее, чем это:
final int[] counts = new int[5];
final int length = array.length - 1;
for (int i = 0; i < length; i++) {
counts[array[i]]++;
}
Обратите внимание, что в цикле для на array.length нет ссылок. Он помещается в локальный финальный тип int, это позволяет избежать разыменования array.length в каждой итерации.
Я сравнил это с этим методом, который использует оператор switch..case и только локальные переменные стека:
int count1 = 0;
int count2 = 0;
int count3 = 0;
int count4 = 0;
for (int i = array.length - 1; i >= 0; i--) {
switch (array[i]) {
case 1:
count1++;
break;
case 2:
count2++;
break;
case 3:
count3++;
break;
case 4:
count4++;
break;
}
}
Результаты показали, что первый метод занял 17300 наносекунд, а метод switch..case - 79800 наносекунд. [ОБНОВЛЕНО: забыл разделить наносекунды на 10. Я запускал каждый метод 10 раз.]
Примечание: перед тем, как проводить бенчмаркинг, я предупреждал виртуальную машину.