《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

 

相关文章
|
6月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
466 6
|
7月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
892 3
|
6月前
|
Java 数据处理 API
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
为什么你的Java代码应该多用Stream?从循环到声明式的思维转变
334 115
|
6月前
|
安全 Java 编译器
为什么你的Java代码需要泛型?类型安全的艺术
为什么你的Java代码需要泛型?类型安全的艺术
241 98
|
6月前
|
安全 Java 容器
告别繁琐判空:Optional让你的Java代码更优雅
告别繁琐判空:Optional让你的Java代码更优雅
|
6月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
485 94
|
6月前
|
Java 编译器 API
java最新版和java8的区别,用代码展示
java最新版和java8的区别,用代码展示
518 43
|
消息中间件 算法 Java
2023金九银十Java高级工程师面试 1000 题+答案(全)
前言 春节过后招聘旺季就到了,不知道大家是否准备好了,面对金三银四的招聘旺季,如果没有精心准备那笔者认为那是对自己不负责任;就我们 Java 程序员来说,多数的公司总体上面试都是以自我介绍+项目介绍+项目细节/难点提问+基础知识点考核+算法题这个流程下来的。 有些公司可能还会问几个实际的场景类的问题,这个环节阿里是必问的,这种问题通常是没有正确答案的,就看个人的理解,个人的积累了。剩下的就没啥了,都是换汤不换药,聊项目就看你自己对你自己的项目是否理解的透彻,比如经常问你你为什么选择这个技术,为什么这么处理之类的,常考的基础的知识点就那么多,最后算法就是靠刷题。 今天为大家分享的就是当前
|
XML JavaScript Java
华为Java工程师面试题
华为Java工程师面试题
162 0
|
消息中间件 Java 关系型数据库
宅家30天,2万字节java高级工程师面试题解析,如何斩获阿里p7
宅家里一个月,“闭关修炼”的你是不是正在为金三银四跳槽季发愁呢?小编今天说的这富含的15个互联网大厂Java高级工程师核心面试问题整理!内容包括: kafka面试题及解析18道 ZooKeeper面试题及解析28道 Linux 面试真题及解析45道 MySQL面试真题及解析50道 springboot面试真题及解析22道 微服务面试真题及解析50道 mybatis面试真题及解析27道 readis面试真题及解析40道 好好学习将这些面试题都吃透,让你金九银十不再慌张。
305 0