1700443670
1700443671
我们再深入地看看这个ArrayList静态内部类,它仅仅实现了5个方法:
1700443672
1700443673
size:元素数量。
1700443674
1700443675
toArray:转化为数组,实现了数组的浅拷贝。
1700443676
1700443677
get:获得指定元素。
1700443678
1700443679
set:重置某一元素值。
1700443680
1700443681
contains:是否包含某元素。
1700443682
1700443683
对于我们经常使用的List.add和List.remove方法它都没有实现,也就是说asList返回的是一个长度不可变的列表,数组是多长,转换成的列表也就是多长,换句话说此处的列表只是数组的一个外壳,不再保持列表动态变长的特性,这才是我们要关注的重点(虽然此处JDK的设计有悖OO设计原则,但这不在我们讨论的范围内,而且我们也无力回天)。
1700443684
1700443685
有些开发者特别喜欢通过如下方式定义和初始化列表:
1700443686
1700443687
List<String>names=Arrays.asList(“张三”,“李四”,“王五”);
1700443688
1700443689
一句话完成了列表的定义和初始化,看似很便捷,却深藏着重大隐患—列表长度无法修改。想想看,如果这样一个List传递到一个允许add操作的方法中,那将会产生何种结果?如果读者有这种习惯,请慎之戒之,除非非常自信该Lis只用于读操作。
1700443690
1700443691
1700443692
1700443693
1700443695
编写高质量代码:改善Java程序的151个建议 建议67:不同的列表选择不同的遍历方法
1700443696
1700443697
我们来思考这样一个案例:统计一个省的各科高考平均值,比如数学平均分是多少,语文平均分是多少等,这是每年招生办都会公布的数据,我们来想想看该算法应如何实现。当然使用数据库中的一个SQL语句就能求出平均值,不过这不再我们的考虑之列,这里还是使用纯Java的算法来解决之,看代码:
1700443698
1700443699
public static void main(String[]args){
1700443700
1700443701
//学生数量,80万
1700443702
1700443703
int stuNum=80*10000;
1700443704
1700443705
//List集合,记录所有学生的分数
1700443706
1700443707
List<Integer>scores=new ArrayList<Integer>(stuNum);
1700443708
1700443709
//写入分数
1700443710
1700443711
for(int i=0;i<stuNum;i++){
1700443712
1700443713
scores.add(new Random().nextInt(150));
1700443714
1700443715
}
1700443716
1700443717
//记录开始计算时间
1700443718
1700443719
long start=System.currentTimeMillis();
[
上一页 ]
[ :1.70044367e+09 ]
[
下一页 ]