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相关推荐

  1. 番石榴分配器vs StringUtils

    因此,我最近写了一篇有关旧的,可靠的Apache Commons StringUtils的文章 ,该文章引起了一些评论,其中之一是Google Guava提供了更好的连接和拆分字符串的机制. 我必须承 ...

  2. guava和commons_使用Guava CharMatcher和Apache Commons Lang StringUtils确定字符串中字符或整数的存在...

    guava和commons 最近Reddit上的帖子提出了一个问题:" 是否存在一种预定义的方法来检查变量值是否包含特定字符或整数? "基于问题的标题也被以另一种方式问到,&quo ...

  3. 使用Guava CharMatcher和Apache Commons Lang StringUtils确定字符串中字符或整数的存在

    最近Reddit上的帖子提出了一个问题:" 是否存在一种预定义的方法来检查变量值是否包含特定字符或整数? "基于问题的标题也被以另一种方式问到,"一种检查变量是否包含诸如 ...

  4. StringUtils.isEmpty和StringUtils.isBlank的区别

    两个方法都是判断字符是否为空的.前者是要求没有任何字符,即str==null 或 str.length()==0:后者要求是空白字符,即无意义字符.其实isBlank判断的空字符是包括了isEmpty ...

  5. 内存分配器设计的演进

    文章目录 栈内存空间是否够用 系统调用申请内存 最简单的内存分配器实现 -- bump allocator 可扩容的 Bump alloactor 通过free-list 管理的 allocator ...

  6. C++ STL: 分配器allocators 源码分析

    STL 基本的六大组件作用以及功能如下: 可以看到allocator是数据存储组件container的幕后支持者,负责为其数据存储分配对应的存储空间. operator::new 在详细介绍alloc ...

  7. StringUtils

    /需要导入第三方jar包pinyin4j.jarimport net.sourceforge.pinyin4j.PinyinHelper;import java.util.regex.Matcher; ...

  8. mysql 自动管理内存_MySQL内存管理,内存分配器和操作系统

    导读 作者:Sveta Smirnova 翻译:郑志江 校对:徐晨亮 原文 :MySQL Memory Management, Memory Allocators and Operating Syst ...

  9. 内存分配器memblock【转】

    转自:http://blog.csdn.net/kickxxx/article/details/54710243 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 背景 Data ...

最新文章

  1. 基于梯度方向、极化变换和聚类算法的图像主特征直线检测
  2. 二分搜索 POJ 2456 Aggressive cows
  3. 用TableView写带特效的cell
  4. linux shell 查看进程 可执行程序路径
  5. HTML(二):表格元素
  6. 基础知识:编程语言介绍、Python介绍、Python解释器安装、运行Python解释器的两种方式、变量、数据类型基本使用
  7. C/C++中输入带空格的字符串 string 转 char*
  8. myeclipse怎么运行c语言,windows下MyEclipse安装配置C/C++开发环境
  9. android 5. 蓝牙 mesh,蓝牙mesh组网
  10. java里面add报错_java.util.Arrays$ArrayList addAll报错
  11. 林肯android auto,林肯mkz仪表盘怎么设置中文
  12. React 性能优化技巧总结
  13. sourcemointor评价代码
  14. 去年的今天我们举行了婚礼
  15. jsp九大内置对象的使用详解
  16. 服装商城电商-前端网页技术精美完整源码HTML+CSS+JS
  17. 机器学习之聚类算法(五)层次聚类代码实现及模型可视化
  18. ASP.net开发环境配置说明手册
  19. 服务器打不开网页dns错误是怎么回事,DNS错误原因是什么 如何解决DNS错误【详细介绍】...
  20. 三年级计算机 键盘指法 教案,三年级下册信息技术教案-第06课键盘指法练习浙江摄影版(新)...

热门文章

  1. 从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的?
  2. java验证身份证号码是否有效源代码
  3. 项目参与度较低怎么办?
  4. mybatis-plus 错误java.lang.NoClassDefFoundError: org/apache/velocity/context/Context
  5. java阻塞队列小结
  6. ssh无密码登陆权威指南
  7. aws lambda使用_使用AWS Lambda,S3和AWS CloudFront进行动态内容缓存
  8. jakarta ee_在等待Jakarta EE时
  9. jdk12 switch_玩JDK 12的Switch表达式
  10. neo4j 连接超时_Neo4j:遍历查询超时