根据网友们提出的意见,这一点我认为值得商榷
(9)如果能估计到待添加的内容长度,为底层以数组方式实现的集合、工具类指定初始长度
比如ArrayList、LinkedLlist、StringBuilder、StringBuffer、HashMap、HashSet等等,以StringBuilder为
例:
StringBuilder() //默认分配16个字符的空间
StringBuilder(intsize) //默认分配size个字符的空间
StringBuilder(Stringstr) //默认分配16个字符+str.length()个字符空间
可以通过类(这里指的不仅仅是上面的StringBuilder)的构造函数来设定它的初始化容量,这样可以明显地提
升性能。比如StringBuilder吧,length表示当前的StringBuilder能保持的字符数量。因为当StringBuilder达到
最大容量的时候,它会将自身容量增加到当前的2倍再加2,无论何时只要StringBuilder达到它的最大容量,它
就不得不创建一个新的字符数组然后将旧的字符数组内容拷贝到新字符数组中—-这是十分耗费性能的一个操
作。试想,如果能预估到字符数组中大概要存放5000个字符而不指定长度,最接近5000的2次幂是4096,每次
扩容加的2不管,那么:
在4096的基础上,再申请8194个大小的字符数组,加起来相当于一次申请了12290个大小的字符数组,
如果一开始能指定5000个大小的字符数组,就节省了一倍以上的空间
把原来的4096个字符拷贝到新的的字符数组中去
这样,既浪费内存空间又降低代码运行效率。所以,给底层以数组实现的集合、工具类设置一个合理的初始化容
量是错不了的,这会带来立竿见影的效果。但是,注意,像HashMap这种是以数组+链表实现的集合,别把初
始大小和你估计的大小设置得一样,因为一个table上只连接一个对象的可能性几乎为0。初始大小建议设置为2
的N次幂,如果能估计到有2000个元素,设置成newHashMap(128)、newHashMap(256)都可以。
(10)当复制大量数据时,使用System.arraycopy()命令
(11)乘法和除法使用移位操作
例如:
1
2
3
4
5
for(val = 0; val < 100000; val += 5)
{
a = val * 8;
b = val / 2;
}
用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,因此建议修改为:
1
2
3
4
5
for(val = 0; val < 100000; val += 5)
{
a = val << 3;
b = val >> 1;
}
移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。
(12)循环内不要不断创建对象引用
例如:
1 for(inti = 1; i <= count; i++)