Вы перебираете все элементы array
(размер 100000), в то время как все, что вам нужно сделать, это найти частоту чисел от 0 до 100 (при условии эксклюзивности) в списке, который вы создали, поэтому переберите 100в два раза эффективнее, чем:
int[] counts = new int[100];
IntStream.range(0,100).forEach(i -> counts[i] = Collections.frequency(l,i));
Кстати, если вы, возможно, итерируете весь массив, чтобы преобразовать его в список, более простой способ сделать это - подсчитать вхожденияэлементы в том же цикле.
int[] counts = new int[100];
for( int i = 0 ; i < array.length ; i ++){
counts[array[i]]++; // same asssumption (array[i] < 100)
}
или в виде потоков
Arrays.stream(array).forEach(i -> counts[i]++);