【Java实用技术】字符串的拆分怎么最快?

简介: 本文是《【Java实用技术】字符串的拆分用什么方法好?》的姊妹篇,拆分方法最常用,使用看似简单但也有很多复杂的细节要注意,今天我们就来聊一聊字符串拆分怎么最快?

本文是《【Java实用技术】字符串的拆分用什么方法好?》的姊妹篇,拆分方法最常用,使用看似简单但也有很多复杂的细节要注意,今天我们就来聊一聊字符串拆分怎么最快?

2种操作性能对比

importorg.apache.commons.lang3.StringUtils;
/*** Java实用技术课程 By Pandas.* 公众号:Java实用技术手册* JDK版本:jdk1.8.0_66** @author Pandas* @date 2021/10/31*/publicclassStringSplitQuick {
publicstaticvoidmain(String[] args) {
StringBuildersb=newStringBuilder();
intmax=100_0000;
for (inti=0; i<max; i++) {
sb.append("a.");
        }
// 构造一个100W个"a."拼接成的字符串:"a.a.a.a.a.......a."Stringstr=sb.toString();
longstart1=System.currentTimeMillis();
String[] cs1=str.split("\\.");
longcost1=System.currentTimeMillis() -start1;
longstart2=System.currentTimeMillis();
String[] cs2=StringUtils.split(str, '.');
longcost2=System.currentTimeMillis() -start2;
longstart11=System.currentTimeMillis();
String[] cs11=str.split("a");
longcost11=System.currentTimeMillis() -start11;
longstart22=System.currentTimeMillis();
String[] cs22=StringUtils.split(str, 'a');
longcost22=System.currentTimeMillis() -start22;
System.out.println("原生拆分.耗时:"+cost1+"ms");
System.out.println("StringUtils拆分.耗时:"+cost2+"ms");
System.out.println("原生拆分a耗时:"+cost11+"ms");
System.out.println("StringUtils拆分a耗时:"+cost22+"ms");
    }
}

运行结果如下:

image.png

总体上来说,原生方法拆分是比StringUtils拆分耗时久点。

还能不能再快呢?这就要分析下源码。


字符串拆分之arraycopy

  • 对于字符串拆分的原生操作!
  • StringUtils拆分操作!

我们注意到上面2个方法都用到了list.toArray()方法,这个方法的源码用到了System.arraycopy(elementData, 0, a, 0, size);方法,这个操作不仅增加额外耗时,也增加内存消耗。

PS:List扩容过程中也会用到这System.arraycopy()方法哦,有兴趣的同学可以多看看他的实现。

public<T>T[] toArray(T[] a) {
if (a.length<size)
// Make a new array of a's runtime type, but my contents:return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length>size)
a[size] =null;
returna;
}

如果内存不够的话,一开始的例子,你可能会遇到下面的错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

考虑到我们在通常开发场景中,我们使用字符串拆分后的操作一般是对拆分后内容遍历,因此使用数组还是List,都不影响我们操作。

上述方法中的List转数组,白白消耗了内存和时间。

在有的工具类(比如hutool)中就改成了List<String>作为返回类型。


补充说明

在《阿里巴巴Java开发手册》(嵩山版)中,有这么一句话

在上一节中,无论是原生split还是StringUtils,都将拆分后为空字符串的部分去掉,因此原始的List容量实际是小于等于保留全部分割数据的大小的。这个在一些拆分后业务处理是有影响的=>就是会数组越界。

比如很常见的场景,由"key=value"组成的字符串,按照“=”拆分,如果不注意,直接使用arr[1]获取value,一定会数组越界。

这时候使用StringUtils.splitPreserveAllTokens(str, "=");可以有效保留空白字符位置。

当然,如果字符串中连要分割的字符都没有,上述方法还是不能返回第二个位置的数据

这个时候你需要自己写一个字符串拆分工具类,返回固定长度的数组/List,这样方法调用者可以放心使用数组。

感谢阅读本期内容,希望对新入行的你有帮助。


往期内容:

我是Pandas,专注Java实用技术分享,公众号Java实用技术手册和B站均有视频解说,欢迎来玩。

如果你觉得这篇文章有用,别忘了点赞+关注,一起进步!


相关文章
|
12天前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
89 60
|
1天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
15 6
|
4天前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
12 1
|
11天前
|
SQL 监控 Java
技术前沿:Java连接池技术的最新发展与应用
本文探讨了Java连接池技术的最新发展与应用,包括高性能与低延迟、智能化管理和监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,为开发者提供了一份详尽的技术指南。
21 7
|
14天前
|
移动开发 前端开发 Java
过时的Java技术盘点:避免在这些领域浪费时间
【10月更文挑战第14天】 在快速发展的Java生态系统中,新技术层出不穷,而一些旧技术则逐渐被淘汰。对于Java开发者来说,了解哪些技术已经过时是至关重要的,这可以帮助他们避免在这些领域浪费时间,并将精力集中在更有前景的技术上。本文将盘点一些已经或即将被淘汰的Java技术,为开发者提供指导。
48 7
|
9天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
24 3
|
9天前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
7 2
|
11天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
20 4
|
9天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
13 1
|
9天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
24 1