stringutils_番石榴分配器vs StringUtils

stringutils

因此,我最近写了一篇关于旧的,可靠的Apache Commons StringUtils的文章 ,该文章引起了很多评论,其中之一是Google Guava提供了更好的连接和拆分字符串的机制。 我必须承认,这是我尚未探索的番石榴的一个角落。 因此,我认为应该仔细研究一下,并与StringUtils进行比较,我不得不承认,我对自己的发现感到惊讶。

肯定有很多不同的方法可以做到这一点吗?

Guava和StringUtils确实采取了风格上不同的方法。 让我们从基本用法开始。

// Apache StringUtils...
String[] tokens1 = StringUtils.split('one,two,three',',');// Guava splitter...
Iterable<String> tokens2 = Splitter.on(',').split('one,two,three');

因此,我的第一个观察结果是Splitter更面向对象。 您必须创建一个拆分器对象,然后使用该对象进行拆分。 而StringUtils拆分器方法使用更具功能性的样式以及静态方法。

在这里,我更喜欢Splitter。 需要一个可重用的拆分器来拆分逗号分隔的列表吗? 一个拆分器还可以修剪开头和结尾的空白,并忽略空元素? 没问题:

Splitter niceCommaSplitter = Splitter.on(',').omitEmptyString().trimResults();niceCommaSplitter.split('one,, two,  three'); //'one','two','three'
niceCommaSplitter.split('  four  ,  five  '); //'four','five'

这看起来真的很有用,还有其他区别吗?

还要注意的另一件事是Splitter返回一个Iterable<String> ,而StringUtils.split返回一个String数组。

真的看不出有什么太大的不同,大多数时候,我只是想依次遍历令牌!

在我研究了这两种方法的性能之前,我也不认为这没什么大不了的。 为此,我尝试运行以下代码:

final String numberList = 'One,Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten';long start = System.currentTimeMillis();  
for(int i=0; i<1000000; i++) {StringUtils.split(numberList , ',');   
}
System.out.println(System.currentTimeMillis() - start);start = System.currentTimeMillis();
for(int i=0; i<1000000; i++) {Splitter.on(',').split(numberList );
}
System.out.println(System.currentTimeMillis() - start);

在我的机器上,以下时间输出:

594
31

番石榴的Splitter快10倍!

现在,这比我预期的要大得多,Splitter比StringUtils快10倍以上。 怎么会这样? 好吧,我怀疑这与返回类型有关。 Splitter返回一个Iterable<String> ,而StringUtils.split为您提供一个字符串数组! 因此, Splitter实际上不需要创建新的String对象。

还值得注意的是,您可以缓存您的Splitter对象,从而可以更快地运行。

番石榴的Splitter每次都赢吗?

稍等一下。 这还不是全部。 注意我们实际上对字符串的结果没有做任何事情吗? 就像我提到的,看起来Splitter实际上并没有创建任何新的Strings。 我怀疑这实际上是将其推迟到它返回的Iterator对象。

那么我们可以测试一下吗?

当然可以 以下是一些代码,可以反复检查生成的子字符串的长度:

final String numberList = 'One,Two,Three,Four,Five,Six,Seven,Eight,Nine,Ten';
long start = System.currentTimeMillis();  
for(int i=0; i<1000000; i++) {final String[] numbers = StringUtils.split(numberList, ',');for(String number : numbers) {number.length();}}
System.out.println(System.currentTimeMillis() - start);Splitter splitter = Splitter.on(',');
start = System.currentTimeMillis();
for(int i=0; i<1000000; i++) {Iterable<String> numbers = splitter.split(numberList);for(String number : numbers) {number.length();}}
System.out.println(System.currentTimeMillis() - start);

在我的机器上,输出:

609
2048

番石榴的Splitter慢了将近4倍!

确实,我期望它们的速度差不多,或者说番石榴速度更快,所以这是另一个令人惊讶的结果。 看起来,通过返回Iterable,Splitter可以立即获得收益,从而可以长期承受痛苦。 确保性能测试实际上在测试有用的东西在这里也有道理。

总之,我想我大多数时候仍会使用Splitter。 在小型列表中,性能差异将可以忽略不计,并且Splitter感觉使用起来要好得多。 仍然令我感到惊讶的是,如果您要拆分很多字符串,而性能是一个问题,那么考虑切换回Commons StringUtils可能是值得的。

参考: Tom's Programming Blog博客上我们JCG合作伙伴 Tom Jefferys的Guava Splitter vs StringUtils 。

翻译自: https://www.javacodegeeks.com/2012/12/guava-splitter-vs-stringutils.html

stringutils

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

workerman php访问,workerman 配置域名访问 (本地)

我确定我在我的liunx 终端 运行了 php start.php start 我为workerman在本地指定了一个域名 打开域名提示 Usage: php yourfile.php {start|stop|restart|reload|status} 请问是什么情况 清楚吗&#xff1f;配置如下server {listen 80; #监听端口&#xff0c;前面可加IPserver_…

使用Spring Integration Java DSL与Rabbit MQ集成

我最近参加了在拉斯维加斯举行的2016年Spring会议 &#xff0c;很幸运地看到了我在软件世界中长期敬佩的一些人。 我亲自遇到了其中的两个人&#xff0c;他们实际上合并了几年前我与Spring Integration相关的一些小贡献– Gary Russel和Artem Bilan &#xff0c;他们启发了我重…

深度学习工程搭建

一个完整的深度学习工程项目包含数据标注&#xff0c;数据训练&#xff0c;数据预测三部分&#xff0c;逻辑结构图和技术架构如下所示&#xff1a; 这里分别从这3个方面进行展开&#xff1a; 1.数据标注&#xff1a;包含原始数据的处理和标注&#xff0c;输出为训练预测可用的网…

多线程还是多进程的选择及区别

http://blog.csdn.net/pingd/article/details/17895933 原文&#xff1a;http://blog.csdn.net/lishenglong666/article/details/8557215 最原始的博主我没有找到&#xff0c;只能把我从何处转的此篇博文的链接发出来。感觉这篇博文写的很棒&#xff0c;特此转载了 鱼还是熊掌…

php.ini settimelimit,PHP-set_time_limit()和ini_set('max_execution_time',...)之间的区别...

两种模式“ set_time_limit(5)”和“ ini_set(max_execution_time&#xff0c;5)”都重置时间&#xff0c;这是一个实用而清晰的示例&#xff1a;//-----------------------------------------------------------//test "max_execution_time":ini_set(max_execution_…

java集合的功能_功能性Java集合

java集合的功能如今&#xff0c;在功能上大肆宣传&#xff0c;因此至少在Java集合方面&#xff0c;我会简要概述一下。 我个人喜欢标准 集合API&#xff0c;但在某些情况下可能会很尴尬并添加其他详细信息。 在Java 8的更高版本中&#xff0c;这应该不是问题。 在那里&#xf…

除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。...

原始&#xff1a; SELECT * from ( SELECT * from test order by id desc) a 解决办法&#xff1a; SELECT * from ( SELECT Top 100 Percent * from test order by id desc) a 转载于:https://www.cnblogs.com/zhaogaojian/p/10385368.html

nodejs 本地php服务器,Nodejs搭建本地http服务器

由于不做php相关的东西&#xff0c;懒得装apache&#xff0c;干脆利用nodejs搭建一个本地的服务器用于测试。nodejs这玩意儿吧&#xff0c;对做前端的介入后端简直就是一把利器。而且目前&#xff0c;nodejs也越来越有商用价值。nodejs其实是非常底层的&#xff0c;从功能上说&…

windows下如何查看磁盘IO性能

通常&#xff0c;我们很容易观察到数据库服务器的内存和CPU压力。但是对I/O压力没有直观的判断方法。磁盘有两个重要的参数&#xff1a; Seek time、 Rotational latency。正常的I/O计数为&#xff1a;①1000/(Seek timeRotational latency)*0.75&#xff0c;在此范围内属正常。…

C++ 贪吃蛇小游戏

。。 转载于:https://www.cnblogs.com/HonkerYblogs/p/10385687.html

使用Lambda,Api Gateway和CloudFormation在AWS云上使用Java

在上一篇文章中&#xff0c;我们实现了基于Java的aws lambda函数&#xff0c;并使用CloudFront进行了部署。 由于我们已经设置了lambda函数&#xff0c;因此我们将使用AWS API Gateway将其与http端点集成。 Amazon API Gateway是一项完全托管的服务&#xff0c;使开发人员可以…

oracle 索引字典,oracle数据字典、索引、序列

*************************数据字典*******************************普通的表 是用来存放 应用程序 需要的数据的student表 是存放学生信息的category 表 是存放 商品种类信息的oracle 也是一个应用程序, oracle这个系统级应用程序本身也需要存放一些数据,这些数据存到哪张表中…

从内核文件系统看文件读写过程

阅读目录 系统调用虚拟文件系统I/O 缓冲区Page CacheAddress Space文件读写基本流程 回到顶部系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境&#xff0c;但是计算机系统的各种硬件资源是有限的&#xff0c;因此为了保证每一个进程都能安全的…

打印沙漏

7-1打印沙漏 &#xff08;20 分&#xff09; 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相…

oracle数据库读取工具,用Oracle导入导出工具实现Oracle数据库移植

用Oracle导入导出工具实现Oracle数据库移植.很不错的方法,建议使用![more]用Oracle导入导出工具实现Oracle数据库移植Oracle数据库作为目前市场的主流数据库之一&#xff0c;许多应用都在其上进行开发&#xff0c;由于Oracle数据库更新换代的原因和不同的应用程序提供商&#x…

遥感影像语义理解

面向高分辨率遥感影像场景语义理解的概率主题模型研究&#xff1a;http://www.lmars.whu.edu.cn/index.php/xwzx/2320.html 基于自适应深度稀疏语义建模的高分辨率遥感影像场景分类&#xff1a;链接 为了挖掘高分辨率遥感场景更具区分性的语义信息&#xff0c;提出了一种将稀疏…

性能优化CPU、内存、磁盘I/O、网络性能相关命令

系统优化是一项复杂、繁琐、长期的工作&#xff0c;优化前需要监测、采集、测试、评估&#xff0c;优化后也需要测试、采集、评估、监测&#xff0c;而且是一个长期和持续的过程&#xff0c;不 是说现在优化了&#xff0c;测试了&#xff0c;以后就可以一劳永逸了&#xff0c;也…

java word批注_编写Java批注

java word批注Java 批注的允许的属性类型刻意非常严格&#xff0c;但是允许的类型也可以使用一些简洁的复合批注类型。 考虑教程站点中的示例注释&#xff1a; package annotation; interface ClassPreamble {String author();String[] reviewers(); }在这里&#xff0c;作者和…

oracle报错ora-00200,oracle 11gR2 rac 创建database报ORA-00200错误

oracle 11gR2 rac创建数据库时,报ORA-00200错误,提示权限不够NOTE: MARK has subscribedNOTE: Loaded library: SystemSUCCESS: diskgroup TESTDG was mountedErrors in file /u01/app/oracle/diag/rdbms/racdb/racdb1/trace/racdb1_ora_16324.trc:ORA-27091: unable to queue …

SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构

摘要 ROS机器人操作系统在机器人应用领域很流行&#xff0c;依托代码开源和模块间协作等特性&#xff0c;给机器人开发者带来了很大的方便。我们的机器人“miiboo”中的大部分程序也采用ROS进行开发&#xff0c;所以本文就重点对ROS…