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

Java字符串與正則表達式操作方法詳解

 更新時間:2025年09月23日 09:46:34   作者:BeanInJ  
在Java編程中正則表達式是一個強大的工具,用于處理字符串和進行模式匹配,這篇文章主要介紹了Java字符串與正則表達式操作的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

寫在前面

1、String在java源碼中是怎么實現(xiàn)的?

2、什么是正則表達式的DFA自動機和NFA自動機?

1、String

1.1、String底層實現(xiàn)

Java 6及以前版本,通過char數(shù)組,每個char占用兩個字節(jié),使得String能夠很好地處理Unicode。

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {  
    private final char[] value;  
    private int offset;  
    private int count;  
    // ...其他成員和方法  
}  

Java 7至Java 8版本,offset和count兩個變量被移除,String.substring不再共享char[],解決內(nèi)存可能泄漏問題。

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {  
    private final char[] value;  
    // ...其他成員和方法  
}  

Java9開始,把char[]改成了byte[] + coder(編碼標(biāo)識)

1.2、str="abc"和new String(“abc”)的區(qū)別

  • str=“abc”
    會先檢查"abc"在不在常量池,在就不創(chuàng)建了,直接拿引用
  • new String(“abc”)
    先將”abc“放入常量池,再將其引用傳給new的String

1.3、使用+拼接字符串

使用+拼接字符串,代碼編譯后,會被替換成StringBuilder。并且每+的一個字符串都可能被new一個新的StringBuilder,所以建議少用+,直接用StringBuilder

1.4、如何使用String.intern節(jié)約內(nèi)存

String a = new String(“a123”).intern();

當(dāng)調(diào)用intern()時,會先查看常量池中是否已有字符串”a123“, 所以當(dāng)多次用到”a123“時,使用String.intern不會再創(chuàng)建新的字符串,從而節(jié)約內(nèi)存。

1.5、分割字符,split()和indexOf()用哪個

split()使用正則表達式實現(xiàn),正則表達式性能是比較不穩(wěn)定的。
indexOf()能分割時盡量用indexOf()

2、正則表達式

2.1、DFA和NFA

正則表達式引擎構(gòu)造代價執(zhí)行效率優(yōu)勢
NFA支持更多,如group、環(huán)視、占有有限量詞
DFA

NFA 自動機回溯

str = "arrrc"
reg = "ar{1,3}c"

自動回溯會先匹配arrr,匹配到c,發(fā)現(xiàn)不是r,就回溯到最后一個r,用reg的c去繼續(xù)匹配

2.2、怎么減少回溯?

1、貪婪模式

如上述例子就是貪婪模式

2、懶惰模式

str = "arrrc"
reg = "ar{1,3}?c"

懶惰模式會先匹配ar,發(fā)現(xiàn)已經(jīng)有一個r了,就開始用c接著匹配

3、獨占模式

str = "arrc"
reg = "ar{1,3}+rc"

獨占模式會先匹配ar,發(fā)現(xiàn)已經(jīng)有一個r了,就開始用rc接著匹配,不會回溯

下面這種獨占模式會回溯

str = "arrc"
reg = "ar{1,3}+c"

獨占模式會先匹配ar,發(fā)現(xiàn)已經(jīng)有一個r了,就開始用c接著匹配,匹配失敗回溯

總結(jié):

1、少用貪婪模式,多用獨占模式

2、減少分支選擇,如將”(abcd|abef)“替換為”ab(cd|ef)“

3、減少捕獲嵌套。

捕獲組: 一個 ()里面的就是一個不獲取

非捕獲組:一個(?:EXP)就是一個非捕獲組

str = "<input id=1>文本</input>"
reg = "(<input.*?)(.*?)(</input)"
# 上面reg包含了3個捕獲組,所以如果輸出捕獲結(jié)果會有整個匹配到的內(nèi)容+括號里面的,4組字符串

str = "<input id=1>文本</input>"
reg = "(?:<input.*?)(.*?)(?:</input)"
# 上面reg包含了1個捕獲組,所以如果輸出捕獲結(jié)果會有整個匹配到的內(nèi)容+捕獲組括號里面的,2組字符串

到此這篇關(guān)于Java字符串與正則表達式操作的文章就介紹到這了,更多相關(guān)Java字符串與正則表達式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redisson分布式鎖原理深入分析

    Redisson分布式鎖原理深入分析

    文章介紹了Redisson分布式鎖的工作原理,并詳細(xì)解釋了加鎖、續(xù)期、解鎖的核心流程,Redisson利用Redis的單線程、自動續(xù)期和Lua腳本原子性等特點,避免了傳統(tǒng)鎖常見的死鎖、鎖爭用和誤刪等問題,此外,還總結(jié)了使用Redisson分布式鎖時的注意事項和避坑點
    2026-04-04
  • Java中構(gòu)造方法set/get和toString的使用詳解

    Java中構(gòu)造方法set/get和toString的使用詳解

    這篇文章主要介紹了Java中構(gòu)造方法set/get和toString的使用詳解,構(gòu)造函數(shù)的最大作用就是創(chuàng)建對象時完成初始化,當(dāng)我們在new一個對象并傳入?yún)?shù)的時候,會自動調(diào)用構(gòu)造函數(shù)并完成參數(shù)的初始化,需要的朋友可以參考下
    2019-07-07
  • Spring使用Redis限制用戶登錄失敗的次數(shù)及暫時鎖定用戶登錄權(quán)限功能

    Spring使用Redis限制用戶登錄失敗的次數(shù)及暫時鎖定用戶登錄權(quán)限功能

    這篇文章主要介紹了Spring使用Redis限制用戶登錄失敗的次數(shù)及暫時鎖定用戶登錄權(quán)限功能,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • struts2標(biāo)簽總結(jié)_動力節(jié)點Java學(xué)院整理

    struts2標(biāo)簽總結(jié)_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細(xì)總結(jié)了struts2標(biāo)簽的使用方法,和學(xué)習(xí)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • SpringBoot項目整合MybatisPlus并使用SQLite作為數(shù)據(jù)庫的過程

    SpringBoot項目整合MybatisPlus并使用SQLite作為數(shù)據(jù)庫的過程

    SQLite是一個緊湊的庫,啟用所有功能后,庫大小可以小于 750KiB, 具體取決于目標(biāo)平臺和編譯器優(yōu)化設(shè)置, 內(nèi)存使用量和速度之間需要權(quán)衡,這篇文章主要介紹了SpringBoot項目整合MybatisPlus并使用SQLite作為數(shù)據(jù)庫,需要的朋友可以參考下
    2024-07-07
  • 深入理解Java中的synchronized 和 ReentrantLock 底層原理

    深入理解Java中的synchronized 和 ReentrantLock 底層原理

    synchronized和ReentrantLock是Java中最核心的兩種鎖實現(xiàn),前者是JVM內(nèi)置鎖(隱式鎖),后者是JUC顯式鎖(基于AQS 框架),本文給大家介紹Java中的synchronized和ReentrantLock底層原理,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • SpringBoot3.x打包Docker容器的實現(xiàn)

    SpringBoot3.x打包Docker容器的實現(xiàn)

    這篇文章主要介紹了SpringBoot3.x打包Docker容器的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Java組件javabean用戶登錄實例詳解

    Java組件javabean用戶登錄實例詳解

    這篇文章主要為大家詳細(xì)介紹了Java組件javabean用戶登錄實例,內(nèi)容有用戶登錄,注冊和退出等,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 微服務(wù)依賴版本管理超完整指南

    微服務(wù)依賴版本管理超完整指南

    在微服務(wù)架構(gòu)中,單個服務(wù)相互協(xié)作以交付功能,這些協(xié)作會在服務(wù)之間形成依賴關(guān)系,其中一個服務(wù)依靠另一個服務(wù)來完成自己的任務(wù),這篇文章主要介紹了微服務(wù)依賴版本管理的相關(guān)資料,需要的朋友可以參考下
    2025-12-12
  • Java?Spring?循環(huán)依賴解析

    Java?Spring?循環(huán)依賴解析

    這篇文章主要介紹了Java?Spring?循環(huán)依賴解析,Spring?現(xiàn)在其實是我們?Java?程序開發(fā)離不開的基礎(chǔ)框架,個人覺得除了?JDK?我們用得最多的?Java?中間件就是?Spring?,今天我們一起來學(xué)習(xí)一下?Spring?的循環(huán)依賴。下面詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-02-02

最新評論

姚安县| 朝阳区| 绵阳市| 武冈市| 香格里拉县| 铜梁县| 芦山县| 江安县| 苍梧县| 洛宁县| 漳平市| 辽源市| 鄂温| 洛隆县| 庆阳市| 平利县| 江永县| 增城市| 抚宁县| 城口县| 枣强县| 五华县| 和林格尔县| 宝应县| 富宁县| 宜都市| 孟村| 平潭县| 宝坻区| 临沭县| 庄浪县| 密山市| 香格里拉县| 京山县| 通海县| 稷山县| 神农架林区| 新和县| 朝阳区| 中超| 肇东市|