Sie können über 2 Milliarden Ints in einem Long speichern. Wo liegt das Problem? Nun, wenn Sie noch mehr Ints benötigen. Machen Sie eine einfache Klasse, die mehrere longs (und long[] wird tun), und fügen Sie auf der Oberseite des 1. Jedes Mal, wenn 2 Milliarden hinzugefügt werden, erhält man einen neuen Long.
Am Ende (avg) werden die Longs in einem BigInteger summiert und geteilt. Der Code hat so gut wie keinen Overhead, einen zusätzlichen Zähler und eine zusätzliche Prüfung (das ist die Verzweigung vorhergesagt).
(Hoffentlich habe ich nicht irgendeinen dummen Fehler gemacht ;))
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
}
}