1700443111
编写高质量代码:改善Java程序的151个建议 建议60:性能考虑,数组是首选
1700443112
1700443113
数组在实际的系统开发中用得越来越少了,我们通常只有在阅读一些开源项目时才会看到它们的身影,在Java中它确实没有List、Set、Map这些集合类用起来方便,但是在基本类型处理方面,数组还是占优势的,而且集合类的底层也都是通过数组实现的,比如对一个数据集求和这样的计算:
1700443114
1700443115
//对数组求和
1700443116
1700443117
public static int sum(int[]datas){
1700443118
1700443119
int sum=0;
1700443120
1700443121
for(int i=0;i<datas.length;i++){
1700443122
1700443123
sum+=datas[i];
1700443124
1700443125
}
1700443126
1700443127
return sum;
1700443128
1700443129
}
1700443130
1700443131
对一个int类型的数组求和,取出所有的数组元素并相加,此算法中如果是基本类型则使用数组效率是最高的,使用集合则效率次之。再看使用List求和:
1700443132
1700443133
//对列表求和计算
1700443134
1700443135
public static int sum(List<Integer>datas){
1700443136
1700443137
int sum=0;
1700443138
1700443139
for(int i=0;i<datas.size();i++){
1700443140
1700443141
sum+=datas.get(i);
1700443142
1700443143
}
1700443144
1700443145
return sum;
1700443146
1700443147
}
1700443148
1700443149
注意看加粗字体,这里其实已经做了一个拆箱动作,Integer对象通过intValue方法自动转换成了一个int基本类型,对于性能濒于临界的系统来说该方案是比较危险的,特别是大数量的时候,首先,在初始化List数组时要进行装箱动作,把一个int类型包装成一个Integer对象,虽然有整型池在,但不在整型池范围内的都会产生一个新的Integer对象,而且众所周知,基本类型是在栈内存中操作的,而对象则是在堆内存中操作的,栈内存的特点是速度快,容量小,堆内存的特点是速度慢,容量大(从性能上来讲,基本类型的处理占优势)。其次,在进行求和计算(或者其他遍历计算)时要做拆箱动作,因此无谓的性能消耗也就产生了。
1700443150
1700443151
在实际测试中发现:对基本类型进行求和计算时,数组的效率是集合的10倍。
1700443152
1700443153
注意 性能要求较高的场景中使用数组替代集合。
1700443154
1700443155
1700443156
1700443157
1700443159
编写高质量代码:改善Java程序的151个建议 建议61:若有必要,使用变长数组
[
上一页 ]
[ :1.70044311e+09 ]
[
下一页 ]