打字猴:1.700443146e+09
1700443146
1700443147 }
1700443148
1700443149 注意看加粗字体,这里其实已经做了一个拆箱动作,Integer对象通过intValue方法自动转换成了一个int基本类型,对于性能濒于临界的系统来说该方案是比较危险的,特别是大数量的时候,首先,在初始化List数组时要进行装箱动作,把一个int类型包装成一个Integer对象,虽然有整型池在,但不在整型池范围内的都会产生一个新的Integer对象,而且众所周知,基本类型是在栈内存中操作的,而对象则是在堆内存中操作的,栈内存的特点是速度快,容量小,堆内存的特点是速度慢,容量大(从性能上来讲,基本类型的处理占优势)。其次,在进行求和计算(或者其他遍历计算)时要做拆箱动作,因此无谓的性能消耗也就产生了。
1700443150
1700443151 在实际测试中发现:对基本类型进行求和计算时,数组的效率是集合的10倍。
1700443152
1700443153 注意 性能要求较高的场景中使用数组替代集合。
1700443154
1700443155
1700443156
1700443157
1700443158 编写高质量代码:改善Java程序的151个建议 [:1700438132]
1700443159 编写高质量代码:改善Java程序的151个建议 建议61:若有必要,使用变长数组
1700443160
1700443161 Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用中非常不方便,比如要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时都可能会有学生入学、退学或转学),所以需要有一个足够大的数组来容纳所有的学生,但问题是多大才算足够大?10年前一台台式机64MB的内存已经很牛了,现在要是没有2GB的内存你都不好意思跟别人交流计算机的配置,所以呀,这个足够大是相对于当时的场景而言的。随着环境的变化,“足够大”也可能会转变成“足够小”,然后就会出现超出数组最大容量的情况,那该如何解决呢?事实上,可以通过对数组扩容“婉转”地解决该问题,代码如下:
1700443162
1700443163 public static<T>T[]expandCapacity(T[]datas, int newLen){
1700443164
1700443165 //不能是负值
1700443166
1700443167 newLen=newLen<0?0:newLen;
1700443168
1700443169 //生成一个新数组,并拷贝原值
1700443170
1700443171 return Arrays.copyOf(datas, newLen);
1700443172
1700443173 }
1700443174
1700443175 上述代码中采用的是Arrays数组工具类的copyOf方法,产生了一个newLen长度的新数组,并把原有的值拷贝了进去,之后就可以对超长的元素进行赋值了(依据类型的不同分别赋值为0、false或null),使用方法如下:
1700443176
1700443177 public static void main(String[]args){
1700443178
1700443179 //一个班级最多容量60个学生
1700443180
1700443181 Stu[]classes=new Stu[60];
1700443182
1700443183 /*classes初始化……*/
1700443184
1700443185 //偶尔一个班级可以容纳80人,数组加长
1700443186
1700443187 classes=expandCapacity(classes,80);
1700443188
1700443189 /*重新初始化超过限额的20人……*/
1700443190
1700443191 }
1700443192
1700443193 通过这样的处理方式,曲折地解决了数组的变长问题。其实,集合的长度自动维护功能的原理与此类似。在实际开发中,如果确实需要变长的数据集,数组也是在考虑范围之内的,不能因固定长度而将其否定之。
1700443194
1700443195
[ 上一页 ]  [ :1.700443146e+09 ]  [ 下一页 ]