Вы можете хранить более 2 миллиардов целых.В чем проблема?Хорошо, если вам нужно еще больше целых.Сделайте простой класс, содержащий несколько длинных (и long [] подойдёт), и добавьте поверх первого.Каждые 2 миллиарда добавлений получают новый новый длинный.
В конце (avg) суммируйте длинные в BigInteger и разделите.В коде практически нет накладных расходов, один дополнительный счетчик и одна дополнительная проверка (это предсказано с помощью ветвления).
[надеюсь, я не сделал глупость на 1;)]
package t1;
import java.math.BigInteger;
import java.util.Arrays;
public class Avg {
long sum;
long[] totals = new long[0];
int counter;
public void add(int v){
if (counter++==Integer.MAX_VALUE){
counter = 0;
int len =totals.length;
totals = Arrays.copyOf(totals, len+1);
totals[len]=sum;
sum = 0;
}
sum+=v;
}
public int avg(){
long count = this.counter;
count+=totals.length*(long)Integer.MAX_VALUE;
BigInteger sum = BigInteger.valueOf(this.sum);
for (long subSum : totals)
sum=sum.add(BigInteger.valueOf(subSum));
return sum.divide(BigInteger.valueOf(count)).intValue();//tweak if you need be
}
}