《Java工程师必读手册》——Java极客主义系列——Java代码高效之道(5)

简介: 《Java工程师必读手册》——Java极客主义系列——Java代码高效之道(5)

接上篇:https://developer.aliyun.com/article/1227041?spm=a2c6h.13148508.setting.17.18334f0eu8bmt9


五、 字符串

 

1. 尽量不要使用正则表达式匹配

 

正则表达式匹配效率较低,尽量使用字符串匹配操作。

 

反例

 

image.png 

 

正例

 

image.png 

 

注意

StringUtils.split函数不保留空字符串。

 

2. 尽量使用字符替换字符串

 

字符串的长度不确定,而字符的长度固定为1,查找和匹配的效率自然提高了。

 

反例

 

image.png 

 

正例

 

image.png 

 

3. 尽量使用StringBuilder进行字符串拼接

 

String是final类,内容不可修改,所以每次字符串拼接都会生成一个新对象。StringBuilder在初始化时申请了一块内存,以后的字符串拼接都在这块内存中执行,不会申请新内存和生成新对象。

 

反例

 

image.png 

 

正例

 

image.png 

 

4. 不要使用""+转化字符串

 

使用""+进行字符串转化,使用方便但是效率低,建议使用String.valueOf.

 

反例

 

image.png

 

正例

 

image.png 

 

5. 尽量预编译正则表达式

 

众所周知,Pattern.compile方法的性能开销很大。但很不幸的是,这个方法可能隐藏在一些我们认为很方便的方法里。比如:String.matches、String.replaceAll、String.split等函数。例如:

 

image.png 

 

对于多次调用这些方法,可以考虑预编译正则表达式以提高执行效率,并参考原有实现代码编写优化后的代码。

 

反例

 

image.png 

 

 

 

正例

 

image.png 

 

六、 数组

 

1. 不要使用循环拷贝数组,尽量使用System.arraycopy拷贝数组

 

推荐使用System.arraycopy拷贝数组,也可以使用Arrays.copyOf拷贝数组。

 

反例

 

image.png 

 

正例

 

image.png 

 

2. 集合转化为类型T数组时,尽量传入空数组T[0]

 

将集合转换为数组有2种形式:toArraynew T[n]和toArraynew T[0]。在旧的Java版本中,建议使用toArraynew T[n],因为创建数组时所需的反射调用非常慢。在OpenJDK6后,反射调用是内在的,使得性能得以提高,toArraynew T[0]比toArraynew T[n]效率更高。此外,toArraynew T[n]比toArraynew T[0]多获取一次列表大小,如果计算列表大小耗时过长,也会导致toArraynew T[n]效率降低。

 

反例

 

image.png 

 

正例

 

image.png 

 

建议

集合应该提供一个toArray(Class clazz)方法,避免无用的空数组初始化(new T[0])。

 

3. 集合转化为Object数组时,尽量使用toArray()方法

 

转化Object数组时,没有必要使用toArray[new Object[0]],可以直接使用toArray()。避免了类型的判断,也避免了空数组的申请,所以效率会更高。

 

反例

 

image.png 

 

正例

 

image.png 


接下篇:https://developer.aliyun.com/article/1227037?spm=a2c6h.13148508.setting.19.18334f0eu8bmt9

 

相关文章
|
13天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
27天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
37 5
Java反射机制:解锁代码的无限可能
|
23天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
59 3
|
29天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
80 10
|
24天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
23天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
2月前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
31 6
|
设计模式 搜索推荐 Java
Java 极客技术 2019 年高考语文卷
Java 极客技术 2019 年高考语文卷
|
9天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
8天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
下一篇
无影云桌面