成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你只會用 split?試試 StringTokenizer,性能可以快 4 倍!!

開發(fā) 后端
我們都知道,分割字符串要使用 String 的 split() 方法,split 方法雖然深入人心,使用也簡單,但效率太低!

 [[437570]]

我們都知道,分割字符串要使用 String 的 split() 方法,split 方法雖然深入人心,使用也簡單,但效率太低!

其實在 JDK 中,還有一個性能很強的純字符串分割工具類:StringTokenizer。

這個類在 JDK 1.0 中就推出來了,但在實際工作卻發(fā)現(xiàn)很少有人使用,網(wǎng)上有人說不建議使用了,甚至還有人說已經(jīng)廢棄了,真的是這樣嗎?

StringTokenizer 被廢棄了嗎?

棧長翻閱了一些資料,原來在 Oracle JDK 官方文檔中已經(jīng)有了描述,這是最新的 Oracle JDK 15 的官方文檔關(guān)于 StringTokenizer 的說明:

StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.

參考:https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/util/StringTokenizer.html

StringTokenizer 原來是一個遺留類,并未被廢棄,只是出于兼容性原因而被保留,在新代碼中已經(jīng)不鼓勵使用它了,建議使用 String 的 split 方法或 java.util.regex 包代替。

再來看 StringTokenizer 類的源碼:

可以看到 StringTokenizer 類并未標識 @Deprecated,說明在后續(xù)的版本中也還可以繼續(xù)使用,官方還會繼續(xù)保留,并不會進行刪除。

就像 JDK 集合中的 Vector 和 Hashtable 類一樣,雖然它們略顯笨重,但并不說明它們沒有用了,另外,它們也不存在致命缺陷,所以一直保留到現(xiàn)在并未廢除掉。

StringTokenizer 沒人用了嗎?

答案:非也!

棧長在最新的 Spring 5.x 框架 StringUtils 工具類中就發(fā)現(xiàn)了 StringTokenizer 的使用身影:

org.springframework.util.StringUtils#tokenizeToStringArray

另外,棧長還看到了一篇《Faster Input for Java》的文章,其中就介紹了他們是使用 StringTokenizer 來分割字符串的,其效率是 string.split() 的 4 倍:

We split the input line into string tokens, since one line may contain multiple values. To split the input, StringTokenizer is 4X faster than string.split().

參考:https://www.cpe.ku.ac.th/~jim/java-io.html

所以,即使 JDK 不鼓勵使用它了,但它并未被廢除,并且性能還這么強,在一些對性能比較敏感的系統(tǒng)中,或者對性能比較有要求的編程競賽中,StringTokenizer 就能發(fā)揮重要作用。

所以,大膽用吧,StringTokenizer 還是可以用的,用的好還能出奇效!

StringTokenizer vs split

說了這么多,相信大部分人都只用過 split,而沒用過 StringTokenizer,那么棧長今天就來對比下這兩個字符串分割法的性能及利弊。

測試代碼如下: 

  1. import java.util.Random;  
  2. import java.util.StringTokenizer;  
  3. /**  
  4.  * @author: 棧長  
  5.  * @from: 公眾號Java技術(shù)棧  
  6.  */  
  7. public class SplitTest {  
  8.     private static final int MAX_LOOP = 10000 
  9.     /**  
  10.      * @author: 棧長  
  11.      * @from: 公眾號Java技術(shù)棧  
  12.      */  
  13.     public static void main(String[] args) {  
  14.         StringBuilder sb = new StringBuilder();  
  15.         System.out.println(sb.toString());  
  16.         for (int i = 0; i < 1000; i++) {  
  17.             sb.append(new Random().nextInt()).append(" ");  
  18.         }  
  19.         split(sb.toString());  
  20.         stringTokenizer(sb.toString());  
  21.     }  
  22.     /**  
  23.      * @author: 棧長  
  24.      * @from: 公眾號Java技術(shù)棧  
  25.      */  
  26.     private static void split(String str) {  
  27.         long start = System.currentTimeMillis();  
  28.         for (int i = 0; i < MAX_LOOP; i++) {  
  29.             String[] arr = str.split(" ");  
  30.             StringBuilder sb = new StringBuilder();  
  31.             for (int j = 0; j < arr.length; j++) {  
  32.                 sb.append(arr[j]);  
  33.             }  
  34.         }  
  35.         System.out.printf("split 耗時 %s ms\n", System.currentTimeMillis() - start);  
  36.     }  
  37.     /**  
  38.      * @author: 棧長  
  39.      * @from: 公眾號Java技術(shù)棧  
  40.      */  
  41.     private static void stringTokenizer(String str) {  
  42.         long start = System.currentTimeMillis();  
  43.         for (int i = 0; i < MAX_LOOP; i++) {  
  44.             StringTokenizer stringTokenizer = new StringTokenizer(str, " ");  
  45.             StringBuilder sb = new StringBuilder();  
  46.             while (stringTokenizer.hasMoreTokens()) {  
  47.                 sb.append(stringTokenizer.nextToken());  
  48.             }  
  49.         }  
  50.         System.out.printf("StringTokenizer 耗時 %s ms", System.currentTimeMillis() - start);  
  51.     }  

在我本機測試結(jié)果如下:

測試次數(shù) split StringTokenizer
1 1ms 1ms
10 7ms 3ms
100 30ms 16ms
1000 129ms 51ms
10000 570ms 486ms
100000 3816ms 3130ms

從測試數(shù)據(jù)看,雖然 StringTokenizer 有一點性能優(yōu)勢,但并不太明顯,我并沒有測試出有 4 倍的性能差距,可能和測試數(shù)據(jù)、測試方法、以及測試的 JDK 版本有關(guān)系。

然后,我再把 split 測試方法中的 " " 改成 "\\s":

測試次數(shù) split StringTokenizer
1 6ms 1ms
10 25ms 4ms
100 90ms 20ms
1000 240ms 59ms
10000 835ms 481ms
100000 5616ms 3362ms

把 split 方法改成正則表達式再測試,這下差距就明顯了。

我們都知道解析正則表達式會比較慢一點,這很正常,但 StringTokenizer 并不支持傳入正則表達式,只能使用字符串作為分隔符,所以這測試結(jié)果就沒多大意義了,這就是癥結(jié)了。。

總結(jié)

雖然 JDK 不鼓勵使用 StringTokenizer 了,但并不說明它不能用了,相反,如果你的系統(tǒng)對性能有非常嚴格的要求,又不是很復雜的字符串分割,好好使用它反而可以帶來高效。

但話又說回來,一般的應用程序用 split 也就夠了,因為它夠簡單、又支持正則表達式,在一般的應用中也不會存在像文中測試的大批量的字符串循環(huán)分割,另外,StringTokenizer 在單次分割的性能上也沒有性能優(yōu)勢。

最后,關(guān)于字符串的分割方法,我們除了字符串本身的 split 方法,我們還要知道 StringTokenizer 這個類,多知道點不是壞事。另外,在 Spring、Apache Commons 工具類中也都有封裝好的 StringTokenizer 工具類,有興趣的可以直接拿去用。

好了,今天的分享就到這里了。

本節(jié)教程所有實戰(zhàn)源碼已上傳到這個倉庫:

https://github.com/javastacks/javastack 

 

責任編輯:龐桂玉 來源: Java編程
相關(guān)推薦

2022-04-28 21:53:52

TypeScriptany類型

2021-09-15 16:05:41

map.putJavaMap

2024-07-10 11:40:15

2022-11-07 17:50:36

2022-08-14 22:35:37

EurekaConsul

2020-03-06 10:25:10

注解Java代碼

2021-12-29 10:30:15

JMH代碼Java

2022-11-01 18:11:16

線上系統(tǒng)性能切割函數(shù)

2022-10-27 07:09:34

DjangoAPIRedis

2023-11-07 12:07:22

2022-04-01 07:52:09

字符串切割工具類

2014-03-26 10:00:06

RailsRails性能

2011-08-10 09:07:30

2018-01-25 05:24:06

無線網(wǎng)網(wǎng)速WiFi

2020-07-21 15:40:55

NginxJava服務器

2022-10-27 08:31:31

架構(gòu)

2019-06-19 10:00:45

vue.jsimbajavascript

2019-06-26 08:37:23

Python數(shù)據(jù)處理編程語言

2021-05-06 05:30:33

JSONstringify()parse()

2025-01-08 13:50:45

JavaScriptsplit
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 99热.com| 蜜桃精品视频在线 | 日日操日日干 | 久久久久久久久久久久久9999 | 国内精品久久久久久 | 国产精品一区久久久 | 欧洲一区二区三区 | 一本在线 | 久久久久久国产精品 | 欧美在线观看一区 | 国产超碰人人爽人人做人人爱 | 国产日韩欧美在线 | 精品欧美乱码久久久久久 | 黄视频免费观看 | 亚洲一区二区日韩 | 亚洲 中文 欧美 日韩 在线观看 | 欧美一级在线观看 | 羞羞午夜| 天天操夜夜艹 | 在线看91| 亚洲女人天堂成人av在线 | 亚洲综合三区 | 国产一伦一伦一伦 | 国产羞羞视频在线观看 | 色黄视频在线 | 毛片网站在线观看 | 91av在线视频观看 | 瑞克和莫蒂第五季在线观看 | 中文字幕日本一区二区 | 久久99精品国产自在现线小黄鸭 | 一二三四在线视频观看社区 | 黄视频免费观看 | 久久中文视频 | 日本成人中文字幕在线观看 | 国产日韩一区二区三区 | 国产精品日韩在线 | 韩日一区二区三区 | 91色视频在线 | 成人av播放 | 一级国产精品一级国产精品片 | 亚洲天堂久久 |