1700443840
1700443841
public E get(int index){
1700443842
1700443843
return entry(index).element;
1700443844
1700443845
}
1700443846
1700443847
由entry方法查找指定下标的节点,然后返回其包含的元素,看entry方法:
1700443848
1700443849
private Entry<E>entry(int index){
1700443850
1700443851
/*检查下标是否越界,代码不再拷贝*/
1700443852
1700443853
Entry<E>e=header;
1700443854
1700443855
if(index<(size>>1)){
1700443856
1700443857
//如果下标小于中间值,则从头节点开始搜索
1700443858
1700443859
for(int i=0;i<=index;i++)
1700443860
1700443861
e=e.next;
1700443862
1700443863
}else{
1700443864
1700443865
//如果下标大于等于中间值,则从尾节点反向遍历
1700443866
1700443867
for(int i=size;i>index;i—)
1700443868
1700443869
e=e.previous;
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++){
[
上一页 ]
[ :1.70044384e+09 ]
[
下一页 ]