java int变量相加_JAVA,10万个Int值相加,怎么实现更有效率

10万个int值相加,怎么实现更有效率。

今天收拾面试题,看到以前被人问的这个题目。

思索无果

欢迎大家来讨论讨论!

昨天根据fonxian的回答试试了一下,发现并没有什么区别!我的实现有问题?

使用线程的算法,可能是因为线程需要额外的开销所以会慢一点。

使用map的就忽略了吧,map版本改了好多次都打不到想要的效果,看来map的开销好大。

分开计算和合并计算并没有什么区别,分开计算的好处根本看不出来~~~~

2017-5-10

感谢thomastao 的提醒,我重新整理了下方法,可以看出来点门道了。我水平有限就不总结了。各位看看就好!

public static void main(String[] args) {

IntSumTest t = new IntSumTest(10000000);

Long startDate1 = new Date().getTime();

//方法注释后的数值为执行时间(毫秒)

//先用map去重,然后相乘。最后将结果相加

t.mapCount(); //7255 8251 8002 7355

//开启多个线程相加,结果记录到sum数组中。最后将sum数组相加。

// t.threadCount(); //5 5 4 4 5 4 5 4 4 4

//一个线程相加分10次相加,结果记录到sum数组中。最后将sum数组相加。

// t.reduceCount(); //4 2 3 3 3 3 4 3 2 3

//直接相加

// t.count(); //11 10 10 10 10 10 12 13 11 11

//使用计数方法

// t.countSum(); //14 15 14 16 12 13 11 12 12 13

Long endDate1 = new Date().getTime();

System.out.println(endDate1- startDate1 );

}

public class IntSumTest {

int[] valueNum = new int[10000000];//1000w个数

public IntSumTest(int maxNum){

Random r = new Random();

for(int i=0;i

valueNum[i] = r.nextInt(maxNum);

}

}

/**

* 直接计算

* @return

*/

public long count(){

long sum = 0;

for(int i=0;i

sum+= valueNum[i];

}

return sum;

}

/**

* 使用计数方法计算

* 理论上的好处在于java栈内的管理方式是所有成员变量都会记录

* @return

*/

public long countSum(){

long sum = 0;

for(int i=0;i

sum = sum( sum,valueNum[i]);

}

return sum;

}

public long sum(long sum ,int num){

return sum+num;

}

/**

* 使用数组计数,然后在各个数字相乘,得到结果

* 该方法的好处在于可以释放大量对象

* 缺点在于,如果数字的分布范围太大,效果就不明显

*/

public long mapCount(){

long sum = 0;

Map map = new HashMap();

for(int i=0;i

map.put(valueNum[i],map.get(valueNum[i])==null?0:map.get(valueNum[i])+1);

}

for (Map.Entry entry : map.entrySet()) {

sum+= entry.getKey()*entry.getValue();

}

return sum;

}

/**

* 多线程计算,分10组计算,分别汇总结果

*/

public long threadCount(){

long sum = 0;

long[] sumNum = new long[10];

for (int i = 0; i < 10; i++) {

MyThread my = new MyThread(sumNum,valueNum,i);

my.run();

}

for (int i = 0; i < 10; i++) {

sum += sumNum[i];

}

return sum;

}

/**

* 分10组计算,分别汇总结果

*/

public long reduceCount(){

long sum = 0;

long[] sumNum = new long[10];

for (int i = 0; i < 10; i++) {

int temp = i*10000;

long max = temp+10000;

for (int j = temp; j < max; j++) {

sumNum[i]+= valueNum[j];

}

}

for (int i = 0; i < 10; i++) {

sum += sumNum[i];

}

return sum;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值