番石榴分配器vs StringUtils
因此,我最近寫了一篇有關舊的,可靠的Apache Commons StringUtils的文章 ,該文章引起了一些評論,其中之一是Google Guava提供了更好的連接和拆分字符串的機制。 我必須承認,這是我尚未探索的番石榴的一個角落。 因此,我認為應該仔細研究一下,并與StringUtils進行比較,我不得不承認,我對自己的發現感到驚訝。
肯定有許多不同的方法可以做到這一點嗎?
Guava和StringUtils確實采取了風格上不同的方法。 讓我們從基本用法開始。
因此,我的第一個觀察結果是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
總結
以上是生活随笔為你收集整理的番石榴分配器vs StringUtils的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos攻击肉鸡怎么收集(ddos如何获
- 下一篇: Oracle ADF移动世界! 你好!