优化层次:设计调优、代码调优、JVM调优、数据库调优
本文重点说常用的代码调优。
一:字符串操作
String 适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
在确定要拼接的字符串为常量的值时候直接用String拼接效率最佳,譬如:
String str = "hello";
String b = "world" + str;
在编译过程成中直接会被优化成 String b = "worldhello"; 当str为变量的时候考虑用StringBuilder或者StringBuffer
无论是 StringBuilder、还是StringBuffer 尽量指定评估初始值的大小(默认16个字节),因为大拼接过程中如果大于原长度,数组会进行扩容,策略将原有的容量翻倍,将源数组的内容复制到新的数组中,此过程中涉及大量的内存复制操作。
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
字符串分隔:Split/Substring/StringTokener
StringTokener.hasMoreElement和String.split(String.split是用正则表达式匹配,所以不使用KMP字符串匹配算法)用的都是按顺序遍历的算法,时间复杂度O(m*n),较高。
substring 效率比较高,但是却是牺牲了空间,以牺牲内存空间换取效率。
public String substring(int beginIndex, int endIndex) {
return ((beginIndex == 0) && (endIndex == value.length)) ? this
: new String(value, beginIndex, subLen);
}
二:核心数据结构
List/Map/Set
ArrayList、LinkList
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据
在知道初始值大小的情况下尽量赋上初始值大小:详情https://blog.csdn.net/weixin_36940953/article/details/82350863