日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

番石榴分配器vs StringUtils

發布時間:2023/12/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 番石榴分配器vs 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

總結

以上是生活随笔為你收集整理的番石榴分配器vs StringUtils的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。