12.性能优化-优化-程序优化

1.字符串优化
1.1. String对象的特点
1)不变性。String对象一旦生成,则不能对它进行改变。不变模式的主要作用是当一个对象需要被多线程共享,并且访问频繁时,可以省略同步和锁等待的时间,从而大幅提高系统性能。
2)针对常量池的优化。当两个String对象拥有相同的值时,他们只引用常量池中的同一份拷贝。(PS:通过javap -verbose命令可以查看到常量池信息。)
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
上述代码的内存分配方式如下:

12.性能优化-优化-程序优化_第1张图片

str1和str2引用了同一块内存地址,str3开辟了一块新的内存地址,但是他们在常量池的位置是一样的。
3)final定义。String类是final的,不允许有任何子类。
1.2. substring()方法
1)内存泄露。方法最后返回了一个新建的String对象,因此该方法存在严重的内存泄露隐患。使用new String(str.substring(begin,end))可以避免内存泄露。
2)类似方法。concat,replace,toLowerCase,toUpperCase,valueOf,Integer.toString,Long.toString这些方法同substring方法类似。
1.3. StringBuilder vs. StringBuffer
1)StringBuffer线程安全,StringBuilder非线程安全。
2)常量累加,String编译器会做优化。
3)频繁变化,请使用StringBuilder和StringBuffer
4)为了避免容量扩充带来的性能消耗,可以在初始化时设置容量大小参数。

2.List接口
1)Vector线程安全,ArrayList非线程安全
2)ArrayList基于数组,LinkedList基于双向链表
3)性能比较ArrayList vs. LinkedList。
a.增加元素到队尾。
ArrayList需要扩充容量,LinkedList需要新建Entry对象,ArrayList性能略好,相差不多,
b.增加元素到任意位置。
ArrayList需要重组数据,LinkedList和在队尾增加相同,LinkedList高几个数量级。
c.删除尾部元素
两者相当。
d.删除头部元素
由于ArrayList需要重组,所以LinkedList速度占优。
e.删除中间位置元素
由于LinkedList需要遍历查找要删除元素,因此LinkedList性能极差,ArrayList明显占优。
4)为了避免容量扩充带来的性能消耗,可以在初始化时设置容量大小参数
3.Map接口
3.1. HashMap vs.HashTable
1)HashMap非线程安全,HashTable线程安全。
2)HashMap允许null做key,HashTable不允许。
3.2. HashMap
1)hash冲突后,退化到链表结构
2)可设置初始容量和负载因子

3.3. LinkedHashMap
1)有序的HashMap
2)不要在迭代器模式中修改被迭代的集合,否则抛出ConcurrentModificationException。
3.4. TreeMap
1)可排序
2)基于红黑树
3)实现排序方法:构造方法注入Comparator,key实现Comparator
4)treeMap的方法:subMap,headMap,tailMap。
3.5.Set
1)基于Map实现
2)元素不能重复
4.代码优化
1)慎用循环体中的异常。
2)局部变量的访问速度优于类成员变量。
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(stack)中,速度较快。
静态变量、实例变量,在堆(heap)中创建,速度较慢。
3)用位运算代替乘除法
4)循环体中提取出表达式
5)展开循环
6)使用arrayCopy()
7)使用Buffer进行IO操作
8)静态方法效率优于实例方法
9)用并行代替串行,充分利用CPU资源。


本文写的比较简单,就是一些点,后续打算深入看一下Java常用集合的源码,例如ArrayList,LinkedList,和HashMap等。
5.参考资料:
1.葛一鸣《Java性能优化》

你可能感兴趣的:(性能优化,程序优化)