《Java編程思想》筆記 第十三章 字元串

来源:https://www.cnblogs.com/mibloom/archive/2018/06/03/9040773.html
-Advertisement-
Play Games

1.String對象不可變 String對象不可變,只讀。任何指向它的引用都不能改變它的內容。改變String內容意味著創建了一個新的String對象。 String 對象作為方法參數時都會複製一份引用(不是複製對象),而引用指向的對象一直呆在單一物理位置上。 2.重載操作符和StringBuild ...


1.String對象不可變

  • String對象不可變,只讀。任何指向它的引用都不能改變它的內容。改變String內容意味著創建了一個新的String對象。
  • String 對象作為方法參數時都會複製一份引用(不是複製對象),而引用指向的對象一直呆在單一物理位置上。

2.重載操作符和StringBuild

  • + += 這2個符號作用於字元串和基本類型數據時意義不相同,Java只有這2個操作符被重載過。

2.1 拼接字元串 + += 編譯器會調用StringBuild來工作。
2.2 拼接字元串時編譯器會創建一個StringBuild對象來生成最終的String,並且調用append方法來拼接字元串,最後用toString輸出。(一條表達式生成一個StringBuild對象)
2.3 如果 + +=在迴圈內,就會生成多個StringBuild對象,影響性能。如果在迴圈外創建StringBuild對象迴圈內調用append方法,就會只有一個對象。
7.Object的toString方法輸出對象引用地址,所有類都繼承它,但大多數類覆寫了toString方法,用來輸出對象內容的字元串。

3.無意識的遞歸

  • 列印對象引用會調用toString,this代表調用當前方法的引用,所以this在toString中會發生遞歸調用。

4.格式化輸出

4.1輸出流的兩種格式化輸出方法。

  • printf( ) 這和C語言中的一樣,使用%d、%f、%s等占位符,但C語言中不能拼接字元串,Java可以。
  • format()和printf( )一樣,printf()調用了format()方法

4.2 Formatter類

4.2.1 新的格式化輸出功能都由Formatter類提供。

4.2.2 創建Formatter對象要給構造器傳遞一些信息,告訴它最後輸出到哪。

4.2.3 格式化說明符

  • %[argument_index$] [flags] [width] [.precision] conversion  [ ] 內為可略內容

     1. argument_index 是一個十進位整數, 2$表示使用參數列表的第2個參數 。
    2. flags 是修改輸出格式的字元集。有效標誌的集合取決於轉換類型。  
    3. width 是一個非負十進位整數,至少達到多少長度,不夠用空格補齊,預設右對齊。 

    4. precision 是一個非負十進位整數,前面有個點,和width區分。通常用來限制字元數,表示最多多少位。

        整數無法使用,String型輸出最大字元量,浮點型表示小數點位數,不足補0,超過四捨五入。
    5. 浮點數 %f 預設輸出小數點後6位

    6. %b  對於Boolean 和 boolean型可以準確輸出,對於其他類型只要不是null,就為true,0也是true。

4.2.4 靜態方法 String.format()返回一個String, 如果只使用一次format()方法,這個比較簡單。

5.正則表達式

5.1 String自帶的正則表達式工具

  • s.split(regex)  將字元串從正則表達式匹配的地方割開,並返回String數組。
  • s.matches(regex) 返回boolean值, 是否能匹配到正則。
  • s.replaceFirst(regex  a)將第一個匹配到的正則換為a. s.replaceAll(regex  a)替換全部。
  • 只使用一次正則表達式建議使用自帶的

5.2 創建正則表達式對象

5.2.1 創建一個正則表達式對象 Pattern p  = Pattern.compile(regex);  

        Pattern 是 final 類 只能通過靜態方法它的compile創建對象。

5.2.2 Matcher m = p.matcher(string); 

        Matcher 同樣也是 final 類

         Pattern對象的matcher方法接受一個字元串並生成一個 Matcher 匹配器對象 ,通過匹配器可以獲得字元串與正則的關係

5.2.3 匹配器的一些方法:

  • m.matches() 整個字元串是否匹配正則
  • m.lookingAt() 字元串的起始部分是否匹配
  • m.find() 查找下一個匹配(下一個意味著有迭代行為)
  • m.find(int start) 從指定位置開始匹配
  • find 只負責匹配,不返回匹配到的結果,匹配到的結果由group()獲取。

5.3 組

  • 組是用括弧劃分的正則表達式,由外向內,由左向右 編號0  1  2  3 。。。叫 組0,組1,組2 。。。

5.3.1 Matcher對象獲得組相關信息的方法

  • public int groupCount() 返回組的數量,不包括組0
  • public String group() 返回前一次的全匹配(組0)相當於group(0)
  • public String group(int i ) 返回 前一次匹配期間指定組,若之前匹配成功,指定組未能匹配則返回null
  • start(int group) 返回匹配到的指定組的起始位置索引。
  • start()返回匹配到的正則起始索引。
  • end(int group) 返回匹配到的指定組的最後一位索引再加一。
  • end()返回匹配到的正則最後一位索引再加一。

6 Pattern標記

  • Pattern.compile(regex,int flage)  flage來自pattern類中的常量,可以調整匹配行為,是對正則式的一種約定。可是使用 | 組合多個標記。
  1. Pattern.CANON_EQ 兩個字元當且僅當它們的完全規範分解相匹配時,就認為它們是匹配的。
  2. Pattern.CASE_INSENSITIVE(?i) 預設情況下,大小寫不敏感的匹配假定只有US-ASCII字元集中的字元才能進行。這個標記允許模式匹配不必考慮大小寫(大寫或小寫)。通過指定UNICODE_CASE標記及結合此標記。基於Unicode的大小寫不滿乾的匹配就可以開啟了。
  3. Pattern.COMMENTS(?x) 在這種模式下,空格符將被忽略掉,並且以#開始直到行末的註釋也會被忽略掉。
  4. Pattern.DOTALL(?s) 在dotall模式中,表達式"." 匹配所有字元,包括終結符。預設情況下,”." 表達式不匹配行終結符。
  5. Pattern.MULTILINE(?m) 在多行模式下,表達式^和$分別匹配一行的開始和結束。^還匹配輸入字元串的開始,而$還匹配輸入字元串的結尾。預設情況下,這些表達式僅匹配輸入的完整字元串的開始和結束。
  6. Pattern.UNICODE_CASE(?u) 當指定這個標記, 並且開啟CASE_INSENSITIVE時,大小寫不敏感的匹配將按照與Unicode標準相一致的方式進行。預設情況下,大小寫不敏感的匹配假定只能在US-ASCII 字元集中的字元才能進行
  7. Pattern.UNIX_LINES(?d) 在這種模式下,在., ^和$行為中, 只識別行終結符\n

7 split()

  • 切割字元串並返回切割後的字元串數組,一切split()方法底層都由Pattern的split()方法提供支持。

1.Pattern.compile(regex).split(String string);

2.Pattern.compile(regex).split(String string, int limit); 從第limit個開始不分割,包括limit。

8 替換

1.String自帶替換

  • public String replaceFirst(String regex,String replacement)   只替換第一個匹配到的正則。
  • public String replaceAll(String regex,String replacement)  替換全部。

2. Matcher 替換

  • Pattern.compile(regex).matcher(str).replaceFirst(repl)   // String 方法的底層實現。
  • Pattern.compile(regex).matcher(str).replaceAll(repl)     // String 方法的底層實現。
  • appendReplacement(StringBuffer sb, String replacement)  漸進式替換  
Pattern p = Pattern.compile("cat");
         Matcher m = p.matcher("one cat two cats in the yard");
         StringBuffer sb = new StringBuffer(); //用於接收被替換的部分
         while (m.find()) {
             m.appendReplacement(sb, "dog");
             //System.out.println(sb.toString());
         }
         m.appendTail(sb); //把剩餘部分存入sb
         System.out.println(sb.toString());

//one dog
//one dog two dog
//one dog two dogs in the yard

 

 3 reset()

  • m. reset(string)   將Matcher對象應用與一個新的字元串,中途改變要匹配的字元串。

9 正則與IO

10 掃描輸入 Scanner

  • 對輸入進行分詞

1.scanner構造器接受任何類型的輸入對象。

2.普通next()方法返回下一個string對象。

3.基本類型除char外的 nextXXX() 方法都返回對應類型的數字。

4.next方法只有找到一個完整的分詞後才返回,否則線程掛起等待。

5.hasNexXXX()方法判斷下一個分詞是否是需要的類型。

6.scanner預設對空字元串分割。

7.scanner.useDlimiter(regex) 使用正則對輸入分詞

8.scanner.dlimiter() 返回 當前正則匹配到的字元串,並作為Pattern對象。

9 正在掃描

  • nextXXX( string)和hasNex(string)都可以傳入String進行匹配。(註意是匹配不是分詞)。也可以傳入string類型和pattern類型的正則進行匹配。
  • 用正則匹配後調用scanner.match(),返回MatcherResult類型的掃描匹配結果。它包含了獲得的內容及捕獲組位置,通過group(i)獲得對應組信息。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於剛剛接觸前端開發或者剛開始學習javascript的同學來說,js能用來做些什麼,它是如何誕生的,它的組成結構是怎麼的,在這些問題上可能都只有一些模糊的概念, js的入門篇 就是希望可以從0開始深入淺出的聊一聊JavaScript這門語言,從而讓剛入門的同學對其有個更加清晰和深入的理解。 首先還 ...
  • 1. break 語句可用於跳出迴圈。 break 語句跳出迴圈後,會繼續執行該迴圈之後的代碼(如果有的話): 2. continue 語句中斷迴圈中的迭代,如果出現了指定的條件,然後繼續迴圈中的下一個迭代。 3. continue 語句(帶有或不帶標簽引用)只能用在迴圈中。 break 語句(不帶 ...
  • 事件委托主要用於一個父容器下麵有很多功能相仿的子容器,這時候就需要將子容器的事件監聽交給父容器來做。父容器之所以能夠幫子容器監聽其原理是事件冒泡,對於子容器的點擊在冒泡時會被父容器捕獲到,然後用e.target來判斷到底是哪個子容器觸發了事件 示例代碼: 點擊第二個li,console輸出<li>2 ...
  • CSS原生變數(CSS自定義屬性) 示例地址:https://github.com/ccyinghua/Css-Variables 一、css原生變數的基礎用法 變數聲明使用兩根連詞線"--"表示變數,"$color"是屬於Sass的語法,"@color"是屬於Less的語法,為避免衝突css原生變 ...
  • 一、URL 傳參 當使用 navigateTo() 方法跳轉頁面的時候,可以在 url 後面接 query 參數 然後在 Page 頁面的生命周期函數 onLoad 中可以接收到這些參數 這種方式只能通過 navigateTo 發送,onLoad 接收 所以只能用於跳轉到非 tabbar 的頁面 二 ...
  • 大家好,下麵我說一下我對面向對象的理解,不會講的很詳細,因為有很多人的博客都把他寫的很詳細了,所以,我儘可能簡單的通過一些代碼讓初學者可以理解面向對象及他的三個要素。 python是一門面向對象編程語言,對面相對象語言編碼的過程叫做面向對象編程。 面向對象時一種思想,與之相對對的是面向過程。我們先簡 ...
  • 前言 目前以LabVIEW為主要開發工具,熟悉常規開發框架(隊列+狀態機),個人用得比較多也感覺比較好用和強大的(JKI,AMC),也用它們開發過一些測試平臺,但感覺到了一個瓶頸期,想尋求突破,提升LabVIEW的編程水平和思想,所以自己開始學習LVOOP,寫此博文,一為自己知識的總結和思考消化,二 ...
  • 說到提高檢索效率,就必然提到索引。今天就來為大家講述搜索引擎中最常見的索引方式——倒排索引。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...