Guava Splitter vs StringUtils
最近写了关于apache commons的StringUtils提供的常用功能介绍,见链接(http://vipcowrie.iteye.com/blog/1513017),但是我们知道google的guava也提供了一些字符串处理的常见功能,所以,我在本文将对两者的字符串分割函数做一次比较详细的对比(结果比较surprise)。
区别
首先看基本的使用方法:
- // Apache StringUtils...
- String[] tokens1= StringUtils.split("one,two,three",',');
- // Google Guava splitter...
- Iteratable<String> tokens2 = Splitter.on(','),split("one,two,three");
// Apache StringUtils... String[] tokens1= StringUtils.split("one,two,three",','); // Google Guava splitter... Iteratable<String> tokens2 = Splitter.on(','),split("one,two,three");
很明显,google提供的方法更加的面向对象一点,因为它要先创建一个Splitter对象,然后使用它来分割字符串,而apache的方法则有点函数式编程的味道,它的方法都是静态的。
这里我更加倾向于采用google的splitter,因为这个对象是可以重用的,且可以在其上附加更多的功能,比如trim,去掉空的元素等,一切都很简单。
- Splitter niceCommaSplitter = Splitter.on(',') .omitEmptyString().trimResults();
- niceCommaSplitter.split("one,, two, three"); //"one","two","three"
- niceCommaSplitter.split(" four , five "); //"four","five"
Splitter niceCommaSplitter = Splitter.on(',') .omitEmptyString().trimResults(); niceCommaSplitter.split("one,, two, three"); //"one","two","three" niceCommaSplitter.split(" four , five "); //"four","five"
看起来有点用,还有其他区别么?
另外一个需要注意的地方就是Splitter返回的是Iteratable<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);
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);
代码很简单,就是都对同一个字符串进行100万次的分隔操作,看看时间上的区别,结果如下:
- 983
- 165
983 165
很明显,guava的速度快很多,这个程序如果运行在每天处理大量字符串的服务中,那么性能差异更加明显。我想其中的原因是Splitter返回的是Iterable<String>,而StringUtils.split返回的是一个String[],需要创建新的String对象,导致耗时增加。
如果我们对Splitter对象缓存,那么速度提高更多:
- start = System.currentTimeMillis();
- Splitter s = Splitter.on(',');
- for (int i = 0; i < 1000000; i++) {
- s.split(numberList);
- }
- System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis(); Splitter s = Splitter.on(','); for (int i = 0; i < 1000000; i++) { s.split(numberList); } System.out.println(System.currentTimeMillis() - start);
结果为12,神奇吧,呵呵
别急,结果还没有出来,目前我们还没有对结果进行处理。我们试试对上面的结果进行处理:
- 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);
- start = System.currentTimeMillis();
- for (int i = 0; i < 1000000; i++) {
- Iterable<String> is = Splitter.on(',').split(numberList);
- for(String s:is) {
- s.length();
- }
- }
- System.out.println(System.currentTimeMillis() - start);
- start = System.currentTimeMillis();
- Splitter sp = Splitter.on(',');
- for (int i = 0; i < 1000000; i++) {
- Iterable<String> is = sp.split(numberList);
- for(String s:is) {
- s.length();
- }
- }
- System.out.println(System.currentTimeMillis() - start);
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); start = System.currentTimeMillis(); for (int i = 0; i < 1000000; i++) { Iterable<String> is = Splitter.on(',').split(numberList); for(String s:is) { s.length(); } } System.out.println(System.currentTimeMillis() - start); start = System.currentTimeMillis(); Splitter sp = Splitter.on(','); for (int i = 0; i < 1000000; i++) { Iterable<String> is = sp.split(numberList); for(String s:is) { s.length(); } } System.out.println(System.currentTimeMillis() - start);
结果再次令人惊奇:
- 851
- 2967
- 2514
851 2967 2514
guava比apache 的StringUtils慢3倍。
结论:
很明显,guava把处理时间较长的操作延迟到后面了,前期处理比较快。无论如何,我还是比较倾向于采用guava处理常见的字符串分隔任务,如果你要处理大量分隔后的字符串,且对性能比较关注,那可以使用StringUtils.split。
相关推荐
├─Google Guava 第01讲-Joiner详细介绍以及和Java8Collector对比.wmv ├─Google Guava 第02讲-Guava Splitter详细讲解以及实战练习.wmv ├─Google Guava 第03讲-Preconditions&Objects;&assert;讲解.wmv ├─...
Guava 提供了有用的字符串工具,如 Joiner 和 Splitter,用于高效地连接和拆分字符串。此外,Strings 类包含了许多静态方法,用于处理常见字符串操作。 6. **I/O 工具** Guava 的 Files 和 CharStreams 模块提供...
在IT行业中,Google Guava库是一个非常强大的工具集,它为Java开发人员提供了一系列实用的集合、缓存、并发和I/O工具。本篇文章将详细探讨如何利用Guava库实现定时缓存功能,以提高应用的性能和效率。 首先,Guava...
Guava提供了更高效、更简洁的字符串处理工具,如Strings类中的join()方法用于拼接字符串,Joiner类提供了更灵活的连接功能,Splitter类则帮助我们根据特定分隔符拆分字符串。 五、函数式编程 Guava引入了Function...
谷歌的Guava库是Java开发中的一个非常重要的开源项目,它提供了一系列的高效、实用的工具类,大大简化了常见的编程任务。Guava的核心特性包括集合框架、缓存、原生类型支持、并发库、字符串处理、I/O操作等。这个...
《Getting Started with Google Guava》是Bill Bejeck所著,旨在帮助Java开发者通过Google Guava库编写更优质、更高效的代码。Bill Bejeck是一位拥有10年经验的资深软件工程师,专注于各种项目的开发工作。在写作...
Guava提供了许多字符串处理的辅助方法,如Joiner和Splitter,它们分别用于连接字符串和分割字符串。Strings类包含了一些实用的静态方法,如isNullOrEmpty、commonPrefix等,可以更方便地处理字符串。 **实用方法** ...
标签:google、guava、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
5. **字符串处理**:Guava 提供了各种字符串工具,如 Joiner、Splitter 和 CharMatcher,可以更方便地进行字符串操作。 6. **I/O 操作**:Guava 提供了 Files、ByteStreams 和 CharStreams 等类,使得文件读写和流...
Guava的核心API包含很多通用的实用工具,如Joiner、Splitter、Charsets、Cache等,这些工具覆盖了日常编程中的各种需求。 通过导入Guava的jar包和源码,开发者可以在Eclipse等IDE中直接查看和学习源代码,加深对...
Guava是一种基于开源的Java库,其中包含谷歌正在由他们很多项目使用的很多核心库。这个库是为了方便编码,并减少编码错误。这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方法...
Google Guava库是由Google开发的一个开源项目,旨在提供Java开发中常用的基础功能。它的目标是简化Java编程,为开发者提供更加清晰、高效的代码编写方式。通过使用Guava库,开发者可以不必在每次项目中重复编写相同...
Google Guava是一个由Google开发并维护的开源Java库,它为Java开发者提供了许多实用的工具类和集合框架,极大地简化了常见的编程任务。这个框架包含了多个模块,如基础(base)、缓存(cache)、I/O(io)以及并发...
Google Guava 是一个由Google提供的开源Java库,它包含了许多强大的工具类和集合类,这些类可以帮助开发者更高效地编写Java代码。Guava的目标是提供一种更加简洁、优雅的方式来处理常见的编程任务,并且在很多情况下...
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...
Google Guava 官方教程 v1.1 2018-07-22 https://github.com/tianbian224/GuavaLearning/blob/master/Google%20Guava%20%E5%AE%98%E6%96%B9%E6%95%99%E7%A8%8B%20-%20v1.1.pdf
《深入解析Google Guava库:Ints模块》 在Java编程中,Google Guava库是一个不可或缺的工具集合,它提供了大量的高效、实用的类和方法,极大地提升了开发效率。本次我们将聚焦于Guava中的`Ints`模块,通过分析`...
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...
《谷歌Guava库详解》 谷歌Guava,全称为Google Guava,是Google推出的一款Java库,它包含一系列基础工具类,旨在简化Java开发工作,提高代码效率和可维护性。Guava的核心特性包括集合框架、缓存、原始类型支持、...
Google Guava 官方教程,电子书,epub格式,可用在手机端阅读