1700443870
1700443871
}
1700443872
1700443873
return e;
1700443874
1700443875
}
1700443876
1700443877
看懂了吗?程序会先判断输入的下标与中间值(size右移一位,也就是除以2了)的关系,小于中间值则从头开始正向搜索,大于中间值则从尾节点反向搜索,想想看,每一次的get方法都是一个遍历,“性能”两字从何说起呢!
1700443878
1700443879
明白了随机存取列表和有序存取列表的区别,我们的average方法就必须重构了,以便实现不同的列表采用不同的遍历方式,代码如下:
1700443880
1700443881
public static int average(List<Integer>list){
1700443882
1700443883
int sum=0;
1700443884
1700443885
if(list instanceof RandomAccess){
1700443886
1700443887
//可以随机存取,则使用下标遍历
1700443888
1700443889
for(int i=0,size=list.size();i<size;i++){
1700443890
1700443891
sum+=list.get(i);
1700443892
1700443893
}
1700443894
1700443895
}else{
1700443896
1700443897
//有序存取,使用foreach方式
1700443898
1700443899
for(int i:list){
1700443900
1700443901
sum+=i;
1700443902
1700443903
}
1700443904
1700443905
}
1700443906
1700443907
//除以人数,计算平均值
1700443908
1700443909
return sum/list.size();
1700443910
1700443911
}
1700443912
1700443913
如此一来,列表的遍历就可以“以不变应万变”了,无论是随机存取列表还是有序列表,它都可以提供快速的遍历。
1700443914
1700443915
注意 列表遍历不是那么简单的,其中很有“学问”,适时选择最优的遍历方式,不要固化为一种。
1700443916
1700443917
1700443918
1700443919
[
上一页 ]
[ :1.70044387e+09 ]
[
下一页 ]