一、散列表类与性能优化
线程同步散列表类
1.Vector 与ArrayList
对于线程安全而言,一些散列表核心类是线程安全的,如Vector类,一些核心类不是线程安全的,如ArrayList类。
原则:对线程安全有严格要求时,尽量选用线程安全的散列表类,在不要求的情况下,尽量选用非线程安全的散列表类,因为线程安全的散列表会将本来可以并行处理的任务的多线程进行排队。当这些线程试图并行访问该散列表对象时,会被转为串行处理。
2.设置ArrayList初始化容量
ArrayList给新添加的元素提供必要的存储空间,需要增加自身的内部数据结构,这个过程由系统自动完成。但如果数组很大,需要提高添加元素的性能
先看一个例子
public class SetArraySize{
final int N = 1000000;
Object obj=new Object();
ArrayList list = new ArrayList();
long startTime = System.currentTimeMills();
for(int i=1; i<N; i++){
list.add(obj);
}
long endTime = System.currentTimeMills();
System.out.println("没有ensucreCapacity耗时:"+ (endTime-startTime) +ms);
list = new ArrayList();
long startTime = System.currentTimeMills();
list.encrureCapacity(N);
for(int i=1; i<N; i++){
list.add(obj);
}
long endTime = System.currentTimeMills();
System.out.println("调用ensucreCapacity耗时:"+ (endTime-startTime)+ms);
}
运行结果:
没有ensucreCapacity耗时:172ms
调用ensucreCapacity耗时:63ms
提前调用ensucreCapacity,系统性能大大提高
3、ArrayList与LinkedList
ArrayList通过内部数组结构Object[]实现,而LinkedList通过一系列的内部记录连接在一起实现,不同场合的应用,性能差别较大
二、String类与性能优化
1.字符串累加与性能优化
StringBuffer.append累加字符串比 + 或+=累加性能高很多,数值越大,差别越大
2.字符串的lentht()与性能优化
在循环外就计算好字符串的长度int len=s.length(),不要在循环中用for(int i=0;i<s.length();i++).每循环一次都要计算长度,必然耗系统资源
3.toCharArray()
调用toCharArray()将字符串转为数组,通过数组索引值获取指定位置的字符,比用charAt()逐一获取特定位置的字符性能提高
4.字符串转为数字
d=new Double("8.97");
d=new Double(8.97); 第二种写法比第一种写法性能高很多倍
三.系统I/O类
1.通过系统缓冲流提高I/O操作效率
2.自定制缓冲区提高I/O操作效率
更大程度提升系统性能。
3.通过压缩流提高I/O操作效率
ZipOutputStream