最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現字符串拆分的三種方法詳解

 更新時間:2026年02月27日 08:52:54   作者:程序員越  
字符串拆分,看似簡單的操作,背后卻隱藏著性能的玄機,本文將和大家詳細介紹一下三種Java實現字符串拆分的方法,有需要的小伙伴可以參考一下

字符串拆分,看似簡單的操作,背后卻隱藏著性能的玄機。今天,我們邀請三位頂尖高手同臺競技:String.split、StringUtils.splitByWholeSeparatorPreserveAllTokens、StringTokenizer。誰才是你項目中的最佳拍檔?

第一章:三大高手簡介

選手門派武功特點登場年代
String.splitJDK名門正則心法,功能強大JDK 1.4
StringUtils.splitByWholeSeparatorPreserveAllTokensApache Commons內外兼修,功能與性能并重
StringTokenizerJDK元老老而彌堅,簡單純粹JDK 1.0

第二章:巔峰對決——性能篇

2.1 性能基準測試

測試環(huán)境:JMH基準測試,拆分100萬次,字符串長度100,10個字段

選手吞吐量 (ops/ms)相對性能內存分配
StringTokenizer8,20096%極少
StringUtils.splitByWholeSeparatorPreserveAllTokens7,80092%中等
String.split2,80033%較多

核心結論

  • StringTokenizer:性能之王,當之無愧的冠軍
  • StringUtils:雖為第三方庫,性能卻遠超JDK原生split
  • String.split:慘遭墊底,僅為冠軍1/3的性能

2.2 為什么String.split這么慢?

關鍵原因:每次調用都要編譯正則表達式!

// 分解String.split的成本
str.split(",") 的實際開銷:

1. Pattern.compile(",")  // 編譯正則,創(chuàng)建Pattern對象

2. Pattern.compile(...).split(str)  // 執(zhí)行拆分

3. 創(chuàng)建臨時數組  // 內存分配

4. 正則引擎匹配  // 復雜的狀態(tài)機遍歷

 JDK底層對單字符做了特殊處理,不用正則引擎,而使用indexOf,單字符性能顯著提升

第三章:巔峰對決——功能篇

3.1 行為對比測試

測試1:連續(xù)分隔符的處理

String str = "a,,b,c";  // 兩個逗號之間是空字符串

// String.split
System.out.println(Arrays.toString(str.split(",")));  
// 輸出: [a, , b, c] ? 默認保留中間空

// StringUtils.splitByWholeSeparatorPreserveAllTokens
System.out.println(Arrays.toString(
    StringUtils.splitByWholeSeparatorPreserveAllTokens(str, ",")));  
// 輸出: [a, , b, c] ? 保留所有空

// StringTokenizer
StringTokenizer st = new StringTokenizer(str, ",");
while(st.hasMoreTokens()) System.out.print(st.nextToken() + " ");
// 輸出: a b c ? 空字符串被直接跳過了!

結論:StringTokenizer默認不返回空標記,這是它與眾不同的地方。

測試2:末尾分隔符的處理

String str = "a,b,c,";  // 末尾有逗號

// String.split (默認)
System.out.println(Arrays.toString(str.split(",")));  
// 輸出: [a, b, c] ? 末尾空被丟棄

// String.split (保留末尾空)
System.out.println(Arrays.toString(str.split(",", -1)));  
// 輸出: [a, b, c, ] ? 用limit=-1保留

// StringUtils.splitByWholeSeparatorPreserveAllTokens
System.out.println(Arrays.toString(
    StringUtils.splitByWholeSeparatorPreserveAllTokens(str, ",")));  
// 輸出: [a, b, c, ] ? 默認保留

// StringTokenizer
StringTokenizer st = new StringTokenizer(str, ",");
while(st.hasMoreTokens()) System.out.print(st.nextToken() + " ");
// 輸出: a b c ? 末尾空被忽略

測試3:特殊分隔符的處理

String str = "a.b.c";


// String.split (需要轉義)
System.out.println(Arrays.toString(str.split("\\.")));  
// 輸出: [a, b, c] ? 但必須記得轉義

// String.split (忘了轉義)
System.out.println(Arrays.toString(str.split(".")));  
// 輸出: [] ? 空數組!因為"."匹配任意字符

// StringUtils.splitByWholeSeparatorPreserveAllTokens
System.out.println(Arrays.toString(
    StringUtils.splitByWholeSeparatorPreserveAllTokens(str, ".")));  
// 輸出: [a, b, c] ? 不用轉義,直接使用

// StringTokenizer
StringTokenizer st = new StringTokenizer(str, ".");
while(st.hasMoreTokens()) System.out.print(st.nextToken() + " ");
// 輸出: a b c ? 也不用轉義

測試4:多字符分隔符

String str = "a--b--c";


// String.split
System.out.println(Arrays.toString(str.split("--")));  
// 輸出: [a, b, c] ? 支持,但"--"是正則,特殊場景需要轉義

// StringUtils.splitByWholeSeparatorPreserveAllTokens
System.out.println(Arrays.toString(
    StringUtils.splitByWholeSeparatorPreserveAllTokens(str, "--")));  
// 輸出: [a, b, c] ? 原生支持多字符,且不涉及正則

// StringTokenizer
StringTokenizer st = new StringTokenizer(str, "--");
while(st.hasMoreTokens()) System.out.print(st.nextToken() + " ");
// 輸出: a b c ? 注意:這是按'-'拆分,不是按"--"!

3.2 功能對比總表

特性String.splitStringUtils.xxxStringTokenizer
保留中間空標記? 支持? 支持? 不支持
保留末尾空標記需limit=-1? 默認保留? 不支持
正則表達式支持? 強大? 不支持? 不支持
多字符分隔符? 支持(正則)? 原生支持? 視為字符集
特殊字符轉義必須轉義無需轉義無需轉義
null輸入拋NPE返回null拋NPE
返回類型String[]String[]Enumeration

第四章:終極總結

4.1 三大高手定位

選手定位適用場景不適用場景
String.split全能選手日常開發(fā)、需要正則性能敏感
StringUtils.xxx平衡大師需要保留空標記、多字符分隔符正則表達式匹配
StringTokenizer元老級大文件處理、遺留系統api陳舊,功能匱乏,不在推薦使用

4.2 如何選擇

如果你不需要正則,大多數場景直接用:StringUtils

String[] result = StringUtils.splitByWholeSeparatorPreserveAllTokens(str, ",");

如果你需要正則能力:String.split 或 Pattern

String[] result = str.split("\\s+");  // 按空白符拆分

如果你僅處理很簡單的文本,追求極致性能:StringTokenizer

StringTokenizer st = new StringTokenizer(str, ",");

4.3 面試官最愛問的問題

Q1:StringUtils.splitByWholeSeparatorPreserveAllTokens為什么比String.split快?

A:因為它使用普通字符串查找(indexOf),不涉及正則表達式,避免了編譯開銷。同時它一次性分配內存,不像StringTokenizer那樣懶加載。

Q2:StringTokenizer現在還推薦使用嗎?

A:除非你在維護遺留系統,或者明確需要它"不返回空標記"的特性,否則不建議在新代碼中使用。它的API太古老,不支持現代Java特性,而且行為與主流方法不一致。

Q3:如果我要解析1GB的日志文件,該用哪個?

A:StringTokenizer或手寫indexOf。因為它們都是流式處理,不會一次性創(chuàng)建大數組。String.split會創(chuàng)建一個大數組,可能導致內存溢出。

結束語

字符串拆分,看似簡單,實則暗藏玄機。四大高手各有所長:

  • String.split:名門正派,能力全面
  • StringUtils:內外兼修,平衡之道
  • StringTokenizer:老而彌堅,返璞歸真

記住:沒有絕對的最好,只有最合適。理解了它們各自的優(yōu)勢和局限,你就能在任何場景下做出明智的決策。

到此這篇關于Java實現字符串拆分的三種方法詳解的文章就介紹到這了,更多相關Java字符串拆分內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MyBatis?枚舉映射的實現示例

    MyBatis?枚舉映射的實現示例

    本文主要介紹了MyBatis?枚舉映射的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-06-06
  • Java創(chuàng)建型設計模式之建造者模式詳解

    Java創(chuàng)建型設計模式之建造者模式詳解

    建造者模式是Java中一種創(chuàng)建型設計模式,它的主要目的是將一個復雜對象的構建過程分解為多個簡單對象的構建過程,本文將詳細介紹Java中的建造者模式,包括它的定義、結構、實現方法以及應用場景等方面,希望對大家有所幫助
    2023-05-05
  • Go Java算法之從英文中重建數字示例詳解

    Go Java算法之從英文中重建數字示例詳解

    這篇文章主要為大家介紹了Go Java算法之從英文中重建數字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • SpringBoot集成P6Spy實現SQL日志的記錄詳解

    SpringBoot集成P6Spy實現SQL日志的記錄詳解

    P6Spy是一個框架,它可以無縫地攔截和記錄數據庫活動,而無需更改現有應用程序的代碼。一般我們使用的比較多的是使用p6spy打印我們最后執(zhí)行的sql語句
    2022-11-11
  • java 線程方法join簡單用法實例總結

    java 線程方法join簡單用法實例總結

    這篇文章主要介紹了java 線程方法join簡單用法,結合實例形式總結分析了Java線程join方法的功能、原理及使用技巧,需要的朋友可以參考下
    2019-11-11
  • SpringBoot切面實現token權限校驗詳解

    SpringBoot切面實現token權限校驗詳解

    這篇文章主要介紹了SpringBoot切面實現token權限校驗詳解,要實現權限校驗,首先數據表和實體類上需要有權限字段,我的表中permission和gender是通過外鍵約束permission表和gender表實現枚舉的,因為可拓展性更好,需要的朋友可以參考下
    2024-01-01
  • 劍指Offer之Java算法習題精講鏈表與字符串及數組

    劍指Offer之Java算法習題精講鏈表與字符串及數組

    跟著思路走,之后從簡單題入手,反復去看,做過之后可能會忘記,之后再做一次,記不住就反復做,反復尋求思路和規(guī)律,慢慢積累就會發(fā)現質的變化
    2022-03-03
  • Java強制轉化示例代碼詳解

    Java強制轉化示例代碼詳解

    這篇文章主要介紹了Java編程語言中的類型轉換,包括基本類型之間的強制類型轉換和引用類型的強制類型轉換,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • Java AOP實現自定義滑動窗口限流器方法詳解

    Java AOP實現自定義滑動窗口限流器方法詳解

    這篇文章主要介紹了Java AOP實現自定義滑動窗口限流器方法,其中滑動窗口算法彌補了計數器算法的不足,滑動窗口算法把間隔時間劃分成更小的粒度,當更小粒度的時間間隔過去后,把過去的間隔請求數減掉,再補充一個空的時間間隔,需要的朋友可以參考下
    2022-07-07
  • Java中BigDecimal使用注意避坑指南

    Java中BigDecimal使用注意避坑指南

    Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算,下面這篇文章主要給大家介紹了關于Java中BigDecimal使用注意避坑的相關資料,需要的朋友可以參考下
    2023-02-02

最新評論

略阳县| 黎城县| 开鲁县| 易门县| 德清县| 苍梧县| 禄丰县| 巴林右旗| 鹤庆县| 普安县| 定兴县| 遂川县| 华安县| 肥西县| 农安县| 图们市| 句容市| 江阴市| 东台市| 娄烦县| 碌曲县| 岳普湖县| 涿州市| 弥勒县| 个旧市| 玉门市| 庄浪县| 德庆县| 新建县| 黎城县| 陇南市| 亳州市| 东乡| 许昌县| 北川| 连平县| 平和县| 沽源县| 武平县| 淳化县| 辽中县|