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
stringutils_番石榴分配器vs StringUtils相关推荐
- 番石榴分配器vs StringUtils
因此,我最近写了一篇有关旧的,可靠的Apache Commons StringUtils的文章 ,该文章引起了一些评论,其中之一是Google Guava提供了更好的连接和拆分字符串的机制. 我必须承 ...
- guava和commons_使用Guava CharMatcher和Apache Commons Lang StringUtils确定字符串中字符或整数的存在...
guava和commons 最近Reddit上的帖子提出了一个问题:" 是否存在一种预定义的方法来检查变量值是否包含特定字符或整数? "基于问题的标题也被以另一种方式问到,&quo ...
- 使用Guava CharMatcher和Apache Commons Lang StringUtils确定字符串中字符或整数的存在
最近Reddit上的帖子提出了一个问题:" 是否存在一种预定义的方法来检查变量值是否包含特定字符或整数? "基于问题的标题也被以另一种方式问到,"一种检查变量是否包含诸如 ...
- StringUtils.isEmpty和StringUtils.isBlank的区别
两个方法都是判断字符是否为空的.前者是要求没有任何字符,即str==null 或 str.length()==0:后者要求是空白字符,即无意义字符.其实isBlank判断的空字符是包括了isEmpty ...
- 内存分配器设计的演进
文章目录 栈内存空间是否够用 系统调用申请内存 最简单的内存分配器实现 -- bump allocator 可扩容的 Bump alloactor 通过free-list 管理的 allocator ...
- C++ STL: 分配器allocators 源码分析
STL 基本的六大组件作用以及功能如下: 可以看到allocator是数据存储组件container的幕后支持者,负责为其数据存储分配对应的存储空间. operator::new 在详细介绍alloc ...
- StringUtils
/需要导入第三方jar包pinyin4j.jarimport net.sourceforge.pinyin4j.PinyinHelper;import java.util.regex.Matcher; ...
- mysql 自动管理内存_MySQL内存管理,内存分配器和操作系统
导读 作者:Sveta Smirnova 翻译:郑志江 校对:徐晨亮 原文 :MySQL Memory Management, Memory Allocators and Operating Syst ...
- 内存分配器memblock【转】
转自:http://blog.csdn.net/kickxxx/article/details/54710243 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 背景 Data ...
最新文章
- 基于梯度方向、极化变换和聚类算法的图像主特征直线检测
- 二分搜索 POJ 2456 Aggressive cows
- 用TableView写带特效的cell
- linux shell 查看进程 可执行程序路径
- HTML(二):表格元素
- 基础知识:编程语言介绍、Python介绍、Python解释器安装、运行Python解释器的两种方式、变量、数据类型基本使用
- C/C++中输入带空格的字符串 string 转 char*
- myeclipse怎么运行c语言,windows下MyEclipse安装配置C/C++开发环境
- android 5. 蓝牙 mesh,蓝牙mesh组网
- java里面add报错_java.util.Arrays$ArrayList addAll报错
- 林肯android auto,林肯mkz仪表盘怎么设置中文
- React 性能优化技巧总结
- sourcemointor评价代码
- 去年的今天我们举行了婚礼
- jsp九大内置对象的使用详解
- 服装商城电商-前端网页技术精美完整源码HTML+CSS+JS
- 机器学习之聚类算法(五)层次聚类代码实现及模型可视化
- ASP.net开发环境配置说明手册
- 服务器打不开网页dns错误是怎么回事,DNS错误原因是什么 如何解决DNS错误【详细介绍】...
- 三年级计算机 键盘指法 教案,三年级下册信息技术教案-第06课键盘指法练习浙江摄影版(新)...
热门文章
- 从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的?
- java验证身份证号码是否有效源代码
- 项目参与度较低怎么办?
- mybatis-plus 错误java.lang.NoClassDefFoundError: org/apache/velocity/context/Context
- java阻塞队列小结
- ssh无密码登陆权威指南
- aws lambda使用_使用AWS Lambda,S3和AWS CloudFront进行动态内容缓存
- jakarta ee_在等待Jakarta EE时
- jdk12 switch_玩JDK 12的Switch表达式
- neo4j 连接超时_Neo4j:遍历查询超时