https://editor.csdn.net/md/?articleId=108047958
https://editor.csdn.net/md/?articleId=108048176
这两篇文章已经知道在开发未完成前不做性能调优,但是需要做的就是代码、算法和设计模式相关的优化。接下来就是要开始做开发工程中的优化点,这篇文章要说的就是字符串String的优化点。
废话不多说,show time
What?
-
String为什么是常量?
第一是为了不被串改;第二是为了让hashCode码不变;根本目的就是可以使用常量池,对于重复的字符串可以重复利用。 -
String的不同初始化方式有什么区别?
String a= "abc";
String b = new String("abc");
首先会在常量池中创建"abc"字符串,然后a的指针指向常量池中的字符串“abc”,接着在堆里面创建一个String对象,这个对象里面包含一个指针指向常量池中的字符串"abc",最后b指针子项堆中的String对象。
他们的区别就是是否在堆中多创建一个对象。
HOW?
- 做长字符串拼接时,拼接过程中有变量时,显示使用 StringBuilder,以提高字符串的拼接性。
- 使用 intern 方法,让变量字符串对象重复使用常量池中相同值的对象,进而节约内存。
- 慎重使用 Split() 方法,Split() 方法使用了正则表达式实现了其强大的分割功能,而正则表达式的性能是非常不稳定的,使用不恰当会引起回溯问题。
正则表达式如何优化
- 少用贪婪模式,多用独占模式:独占模式就是在字符后面加一个“+”,比如ab{1,3}c 这个是贪婪模式,ab{1,3}+c就是独占模式。好处就是如果结果不匹配,结束匹配,不会发生回溯问题。
- 减少分支选择分支选择类型“(X|Y|Z)”的正则表达式会降低性能,我们在开发的时候要尽量减少使用。
如果一定要用可以采取以下几个方式进行优化:
1、把常用选项放在最前面:比如Y最常用,所以变为(Y|X|Z)
2、提取共有的:比如(abcd|abef)变为 ab(cd|ef)
3、如果是简单的分支选择类型,我们可以用三次 index 代替“(X|Y|Z)” - 减少捕获嵌套,一般一个 () 就是一个捕获组。如果表达式是(?:exp)组成,则为非捕获主。
参考资料:
1、《JAVA性能调优实战》作者:刘超
2、https://www.cnblogs.com/aaronjs/archive/2012/06/30/2570805.html