String類與StringBuffer類

来源:https://www.cnblogs.com/ITnoteforlsy/archive/2020/02/06/12270884.html
-Advertisement-
Play Games

String類與StringBuffer類 一、String類和StringBuffer類的區別 String類是不可變類,新建的對象為不可變對象(String類的內容和長度是固定的),一旦被創建就不能修改它的值(對於已經存在的String對象的修改都是重新創建一個新的對象,然後把新的值保存進去);... ...


String類與StringBuffer類

 

一、String類和StringBuffer類的區別

String類是不可變類,新建的對象為不可變對象(String類的內容和長度是固定的),一旦被創建就不能修改它的值(對於已經存在的String對象的修改都是重新創建一個新的對象,然後把新的值保存進去); String類是final類型不可被繼承。

StringBuffer類是可變類,新建的對象是一個可變的對象,當需要修改其內容的時候,不需要再創建新的字元串對象,而是直接操作原來的串;不能通過賦值符號對他進行賦值(只能通過構造函數來建立, StringBuffer sb = new StringBuffer(),每個StringBuffer對象都有一定的緩衝區容量,當字元串大小超過容量時,會自動增加容量);字元串連接操作中StringBuffer的效率要比String

另外由於StringBuffer是線程安全的,所以在多線程程式中也可以很方便的進行使用,但是程式的執行效率相對來說就要稍微慢一些。從JDK5開始,為該類補充了一個單個線程使用的等價類,即StringBuilder。與該類相比,通常應該優先使用StringBuilder,因為它支持所有相同的操作,但由於它不支持同步,所以速度更快。

String 作為參數傳遞是類似於基本數據類型作為參數傳遞(值傳遞),StringBuffer 作為參數傳遞就是引用數據類型傳遞。

總結一下:

相同點:

    (1)String類與StringBuffer類都用來處理字元串。

    (2)部分方法在二者中的用法是相同的。

    (3)在這兩個類中,字元的索引都是從0開始的。

    (4)這兩個類都是CharSequence的子類。CharSequence介面描述的是一系列字元集。

不同點:

1)String類是不可變類,因為在底端是用字元數組實現的,而數組長度固定,一旦賦值,就不能在原來的字元串上進行修改可能會浪費空間。StringBuffer類是可變類,能夠在原來的數組上進行修改。

2)String類覆蓋了Object類的equals()方法,而StringBuffer類沒有覆蓋該方法。比較StringBuffer字元串內容是否相等,可以使用toString() 方法將StringBuffer的內容轉換為String 字元串,再使用equals()方法比較。

3)雖然兩個類都覆蓋了toString()方法,但各自的實現方式不同。String類的toString()方法返回當前String對象的引用。而StringBuffer類的toString()方法返回一個以當前StringBuffer的緩衝區的所有字元為內容的新的String對象的引用。

4String類對象可以用操作符"+"進行連接,而StringBuffer類的對象通過append()方法添加新的字元串。

二、StringBuffer對象和String對象之間的互轉

String s = "abc";

StringBuffer sb1 = new StringBuffer("123");

StringBuffer sb2 = new StringBuffer(s); //String轉換為StringBuffer

String s1 = sb1.toString(); //StringBuffer轉換為String

三、StringBuffer

1.StringBuffer的構造方法

public StringBuffer() 構造一個其中不帶字元的字元串緩衝區,其初始容量為 16 個字元。

public StringBuffer(int capacity):指定容量大小

public StringBuffer(String str):構造一個字元串緩衝區:裡面的容量(字元串內容英文)大小:字元串長度+16初始容量

使用append()方法在字元串後面追加東西的時候,如果長度超過了該字元串存儲空間大小了就自動進行擴容:構建新的存儲空間更大的字元串,將舊的複製過去;

在進行字元串append添加的時候,會先計算添加後字元串大小,傳入一個方法:ensureCapacityInternal 這個方法進行是否擴容的判斷,需要擴容就調用expandCapacity方法進行擴容:嘗試將新容量擴為大小變成2+2 ,判斷一下 容量如果不夠,直接擴充到需要的容量大小。

2.StringBuffer獲取功能

public int capacity():初始容量

public synchronized int length():返回字元串長度

3.StringBuffer的添加功能

StringBuffer append(xxx x):將指定的內容追加(末尾追加)到字元串緩衝區中,返回StringBuffer本身

public StringBuffer insert(int index,xxx x):在指定位置處,插入一個新的內容,返回StringBuffer本身

void setLength(int newLength) 重新設置字元串緩衝區中字元串的長度,如果newLength小於當前的字元串長度,將截去多餘的字元。

public void ensureCapacity (int minimumCapacity) 重新設置字元號串緩衝區的總空間。如果minimumCapacity大於當前的總空間,則新的空間被設置:一種結果是minimumCapacity;另一種結果是{"老空間"乘22}

4.StringBuffer的刪除功能

StringBuffer deleteCharAt(int index) :刪除指定位置出的字元,返回字元串緩衝區本身

StringBuffer delete(int start, int end) :刪除從指定位置開始到指定位置結束,返回值字元串緩衝區本身

public void trimToSize()StringBuffer對象的中存儲空間縮小到和字元串長度一樣的長度,減少空間的浪費。

5.StringBuffer的替換功能

public StringBuffer replace(int start,int end,String str):從指定位置開始到指定位置結束,用給定的str字元串替換指定的字元內容

public void setCharAt(int index, char ch):修改對象中索引值為index位置的字元為新的字元ch

6.StringBuffer的反轉功能

public StringBuffer reverse () 反轉功能

7.StringBuffer的截取功能

String substring(int start) :從指定位置預設截取到末尾,返回一個新的字元串

String substring(int start,int end):從指定位置開始截取到指定位置結束

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 從當前StringBuffer對象的索引號srcBegin開始,到srcEnd結束的子串,賦值到字元數組dst中,並且從dst的索引號dstBegin開始。

8. StringBuffer查找功能

int indexOf(String str) 返回當前StringBuffer對象中,第一個滿足str子串的位置。

int indexOf(String str, int fromIndex) 從當前StringBuffer對象的fromIndex開始查找,返回第一個滿足str子串的位置。

int lastIndexOf(String str) 返回當前StringBuffer對象中,最後一個滿足str子串的位置。

int lastIndexOf(String str, int fromIndex) 從當前StringBuffer對象的fromIndex開始查找,返回最後一個滿足str子串的位置。

四、String類方法(分類參考

方法摘要

 char

charAt(int index)
          
返回指定索引處的 char 值。

 int

codePointAt(int index)
          
返回指定索引處的字元(Unicode 代碼點)。

 int

codePointBefore(int index)
          
返回指定索引之前的字元(Unicode 代碼點)。

 int

codePointCount(int beginIndex, int endIndex)
          
返回此 String 的指定文本範圍中的 Unicode 代碼點數。

 int

compareTo(String anotherString)
          
按字典順序比較兩個字元串。

 int

compareToIgnoreCase(String str)
          
按字典順序比較兩個字元串,不考慮大小寫。

 String

concat(String str)
          
將指定字元串連接到此字元串的結尾。

 boolean

contains(CharSequence s)
          
當且僅當此字元串包含指定的 char 值序列時,返回 true

 boolean

contentEquals(CharSequence cs)
          
將此字元串與指定的 CharSequence 比較。

 boolean

contentEquals(StringBuffer sb)
          
將此字元串與指定的 StringBuffer 比較。

static String

copyValueOf(char[] data)
          
返回指定數組中表示該字元序列的 String

static String

copyValueOf(char[] data, int offset, int count)
          
返回指定數組中表示該字元序列的 String

 boolean

endsWith(String suffix)
          
測試此字元串是否以指定的尾碼結束。

 boolean

equals(Object anObject)
          
將此字元串與指定的對象比較。

 boolean

equalsIgnoreCase(String anotherString)
          
將此 String 與另一個 String 比較,不考慮大小寫。

static String

format(Locale l, String format, Object... args)
          
使用指定的語言環境、格式字元串和參數返回一個格式化字元串。

static String

format(String format, Object... args)
          
使用指定的格式字元串和參數返回一個格式化字元串。

 byte[]

getBytes()
          
使用平臺的預設字元集將此 String 編碼為 byte 序列,並將結果存儲到一個新的 byte 數組中。

 byte[]

getBytes(Charset charset)
          
使用給定的 charset 將此 String 編碼到 byte 序列,並將結果存儲到新的 byte 數組。

 void

getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin)
          
已過時。 該方法無法將字元正確轉換為位元組。從 JDK 1.1 起,完成該轉換的首選方法是通過 getBytes() 方法,該方法使用平臺的預設字元集。

 byte[]

getBytes(String charsetName)
          
使用指定的字元集將此 String 編碼為 byte 序列,並將結果存儲到一個新的 byte 數組中。

 void

getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
          
將字元從此字元串複製到目標字元數組。

 int

hashCode()
          
返回此字元串的哈希碼。

 int

indexOf(int ch)
          
返回指定字元在此字元串中第一次出現處的索引。

 int

indexOf(int ch, int fromIndex)
          
返回在此字元串中第一次出現指定字元處的索引,從指定的索引開始搜索。

 int

indexOf(String str)
          
返回指定子字元串在此字元串中第一次出現處的索引。

 int

indexOf(String str, int fromIndex)
          
返回指定子字元串在此字元串中第一次出現處的索引,從指定的索引開始。

 String

intern()
          
返回字元串對象的規範化表示形式。

 boolean

isEmpty()
          
當且僅當 length()  0 時返回 true

 int

lastIndexOf(int ch)
          
返回指定字元在此字元串中最後一次出現處的索引。

 int

lastIndexOf(int ch, int fromIndex)
          
返回指定字元在此字元串中最後一次出現處的索引,從指定的索引處開始進行反向搜索。

 int

lastIndexOf(String str)
          
返回指定子字元串在此字元串中最右邊出現處的索引。

 int

lastIndexOf(String str, int fromIndex)
          
返回指定子字元串在此字元串中最後一次出現處的索引,從指定的索引開始反向搜索。

 int

length()
          
返回此字元串的長度。

 boolean

matches(String regex)
          
告知此字元串是否匹配給定的正則表達式。

 int

offsetByCodePoints(int index, int codePointOffset)
          
返回此 String 中從給定的 index 處偏移 codePointOffset 個代碼點的索引。

 boolean

regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
          
測試兩個字元串區域是否相等。

 boolean

regionMatches(

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

-Advertisement-
Play Games
更多相關文章
  • 基本存儲單元 位(bit, b):二進位數中的一個數位,可以是0或者1,是電腦中數據的最小單位。 位元組(Byte,B):電腦中數據的基本單位,每8位組成一個位元組。 1B = 8b 各種信息在電腦中存儲、處理,至少需要一個位元組的空間。 位元組與字元 電腦存儲的一切數據都是由一串 0 和 1 組成 ...
  • 今天是2020年2月6日,時間過得好快,以至於我在寫到時間會下意識寫成2019年…… 看來全國肺炎情況進一步升溫了,以至於我家所在的小區進行了命令封鎖通知,所以出行不再像以前那麼自由了,不管怎樣,給戰鬥在一線的抗肺炎醫生們以及相關工作人員加油打氣。 言歸正傳,今天完成了有關python學習過程中的一 ...
  • 學習pandas兩天了,關於這個增加行的問題一直困擾著我,測試了幾個代碼,終於搞通了一點(昨天是因為代碼敲錯了。。。) 直接上代碼: 1 dates = pd.date_range('20170101',periods=6) 2 df1 = pd.DataFrame(np.arange(24).re ...
  • | A | B | C | D | E | F | G | H | I | J | | : : | : : | : : | : : | : : | : : | : : | : : | : : | : : | | $\checkmark$ | $\checkmark$ | $O$ | $\checkm ...
  • 前言 CountDownLatch是什麼? CountDownLatch是具有synchronized機制的一個工具,目的是讓一個或者多個線程等待,直到其他線程的一系列操作完成。 CountDownLatch初始化的時候,需要提供一個整形數字,數字代表著線程需要調用countDown()方法的次數, ...
  • 這裡簡單理解:簡單工廠又叫靜態工廠;是將工廠方法的方法體加上static 問題來了,什麼是開閉原則?又有哪些設計原則呢? 開閉原則就是說對擴展開放,對修改關閉。在程式需要進行拓展的時候,不能去修改原有的代碼,實現一個熱插拔的效果。所以一句話概括就是:為了使程式的擴展性好,易於維護和升級。想要達到這樣 ...
  • 二叉樹的基本操作,為 二叉查找(搜索、排序)樹、二叉平衡樹(AVL樹)、紅黑樹 等提供基礎介面。 名稱空間:namespace BTO 基礎介面如: ① 遍歷操作: 遞歸 和 非遞歸 版本的 先序、中序、後序 遍歷。 層序遍歷。 介面原型:void xxxTraversal(_Node*& _nod ...
  • 原文地址:https://www.cnblogs.com/xrq730/p/5060921.html 1、多線程有什麼用? 一個可能在很多人看來很扯淡的一個問題:我會用多線程就好了,還管它有什麼用?在我看來,這個回答更扯淡。所謂"知其然知其所以然","會用"只是"知其然","為什麼用"才是"知其所以 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...