9 个 Java 性能调优技巧,YYDS!
那么,你应该选择哪种方法呢?
答案取决于连接字符串的代码。如果你是以编程方式将新内容添加到字符串中,例如在for
循环中,则应使用?StringBuilder
?。它很易于使用,并提供比?StringBuffer
?更好的性能。但请记住,与?StringBuffer
?相比, StringBuilder 不是线程安全的,可能并不适用于所有情况。
你只需要实例化一个新的?StringBuilder
?并调用append
方法来向String
中添加一个新的部分。在你添加完了所有的部分后,你可以调用toString()
方法来检索已连接的字符串。
下面的代码片段展示了一个简单的例子。在每次迭代期间,该循环将 i 转换为一个?String
?,并将其与空格一起添加到?StringBuilder sb?中。所以,最后,这段代码在日志文件中写入 “This is a test0 1 2 3 4 5 6 7 8 9” 。
StringBuilder?sb?=?new?StringBuilder(“This?is?a?test”);for?(int?i=0;?i<10;?i++)?{
sb.append(i);
sb.append(”?“);
}
log.info(sb.toString());
正如你在代码片段中看到的。我们可以为字符串的第一个元素提供到构造函数中。这会创建一个?StringBuilder?,其中包含了你所提供的字符串以及 16 个额外字符的容量。当你向?StringBuilder?中添加更多字符时,你的 JVM 将动态的增加?StringBuilder?的大小。
如果你已经知道字符串将包含多少个字符,则可以将该数字提供给不同的构造方法以实例化具有指定容量的?StringBuilder
?。这进一步提高了效率,因为它不需要动态扩展其容量。
如果您正在学习 Spring Boot,推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/
6. 尽可能使用基本类型
避免任何开销并提高应用程序性能的另一种简便快速的方法是使用基本类型而不是其包装类。所以,最好使用 int 而不是 Integer ,是 double 而不是 Double 。这将使得你的 JVM 将值存储在堆栈而不是堆中,以减少内存消耗,并更有效地处理它。
7. 尽量避免大整数和小数
由于我们已经在讨论数据类型,所以我们也应该快速浏览大整数和小数。尤其是后者因其精确性而受欢迎。但这是有代价的。大整数和小数比一个简单的?long?型或?double?型需要更多的内存,并会显著减慢所有的运算。
所以,如果你需要额外的精度,或者如果你的数字超出一个较长的范围,最好要三思。这可能是你需要更改并解决性能问题的唯一方法,尤其是在实现数学算法时。
8. 使用 Apache Commons StringUtils.Replace 而不是 String.replace
一般来说,String.replace 方法可以正常工作,并且效率很高,尤其是在你使用 Java 9 的情况下。但是,如果你的应用程序需要大量的替换操作,并且没有更新到最新的 Java 版本,那么检查更快和更有效的替代品依然是有必要的。
有一种候选方案是 Apache Commons Lang 的?StringUtils.replace?方法。正如 Lukas Eder 在他最近的一篇博客文章中所描述的,它远远胜过了 Java 8 的 String.replace 方法。
而且它只需要很小的改动。你只需要将 Apache Commons Lang 项目的 Maven 依赖项添加到你的应用程序的 pom.xml 中,并将 String.replacemethod 的所有调用替换为 StringUtils.replace 方法。
//?replace?this
test.replace(“test”,?“simple?test”);
//?with?this
StringUtils.replace(test,?“test”,?“simple?test”);
9. 昂贵的缓存资源,如数据库连接
缓存是避免重复执行昂贵或常用代码片段的流行解决方案。总的思路很简单:重复使用这些资源比创建一个新的资源更划算。
一个典型的例子是缓存池中的数据库连接。新连接的创建需要时间,如果你重用现有连接,则可以避免这种情况。
你也可以在 Java 语言源码中找到其他的例子。例如,在 Integer 类中的 valueOf 方法缓存了介于 -128 到 127 之间的值。你可能会说创建一 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 个新的 Integer 并不是太昂贵,但是由于它经常被使用,因此缓存最常用的值也可以提供性能优势。
但是,当你考虑使用缓存时,请记住缓存实现也会产生开销。你需要花费额外的内存来储存可重复使用的资源,因此你可能需要管理你的缓存以使资源可访问,并删除过期的资源。
所以,在开始缓存任何资源之前,请确保它们是经常使用的,以超过缓存实现的开销(代价)。
总结
正如你所看到的,有时不需要太多的工作就可以提高你的应用程序的性能。本文中的大部分建议只需要稍作努力就可以将它们应用于你的代码中。
但还是那句话,最重要的还是那些与是什么编程语言无关的技巧:
在你知道其必要性之前不要进行优化
使用分析器(profiler)来查找真正的瓶
优先处理最大的瓶颈
往期推荐
[](()
[六成大学生认为自己毕业 10 年内会年入百万!网友:知乎上多了,没被社会毒打过吧!](()
[](()
[](()
[缓存核心知识小抄,面试必备,赶紧收藏!](()
[](()
[](()
[Java 17 正式发布, Oracle 宣布免费提供!“版本任你发,我用 Java 8”或成历史?](()
[](()
[](()
[Spring Boot 中使用 @Async 实现异步调用,加速任务执行!](()
评论