JavaSE:StringBuilder和StringBuffer類

1、引言

在上一篇文章中,我們理解了字符串的常用方法,細心的同學大概已經發現,不管是將字符串中的字符轉變為大寫或小寫,或是完成字符串的替換,又或是去除空白字符等等,只要涉及到字符串的修改,我們都是生成了一個新的字符串,而不是改變原有的字符串。

例如(toLowerCase方法的源碼,返回新的字符串對象):

這是因為String類的對象是不可以被修改的(字符串具有不可變性)。關于字符串為什么不可以被修改,答案就在下面的文章中~

2、字符串為什么具有不可變性

2.1 String類在源碼中的設計

2.1.1 String類被final所修飾

為什么不可被修改呢?我們先來觀察String類的源碼:

我們可以看到String類被final所修飾,但是這并不是字符串不可變的原因,因為當類被final修飾時,只能說明這個類不能被繼承,也就是說String類不可被繼承,而不是不可變。

2.1.2 value被final所修飾

我們繼續往下看,

我們又發現,value數組也被final修飾了,我們知道,String類的value數組才真正存儲了字符串的內容,到這里,有的同學就開始激動了,就說:"value數組被final修飾了,變成了常量,常量不可變,所以字符串就具有不可變性!!!"。

但事實并不是這樣,因為數組是一個引用類型,當引用類型被final修飾,只能說明當前引用變量的指向不能改變,而并不是不能修改它所指向的內容,我們來觀察以下代碼:

我們發現,當數組被final修飾后,我們可以改變它的內容,但是不能改變它的指向,也就是說final修飾value數組并不是字符串不可變的原因。(很多同學都會在這里產生誤解)

2.1.3 value數組被private修飾封裝

其實這點才是字符串不可變的真正原因,value數組被封裝在了String類當中,沒有提供任何的get和set方法,無法獲取到字符串,當然也不可能被修改。

2.2?總結

1.當一個類被final修飾,說明這個類不能被繼承。也就是說,String類被final修飾不是字符串不可變的原因。

2.當一個引用類型被final所修飾,說明這個引用的指向不能改變,但是可以修改這個引用所指向的內容。也就是說,value被final修飾不是字符串不可變的原因。

3.value被private修飾,被封裝起來才是字符串不可變的真正原因。

3、字符串的修改

3.1 使用"+"對字符串拼接

我們已經理解了字符串為什么不可變,也知道了字符串的修改實質上會再創建一個新對象,

因此,我們每使用一次"+"來完成字符串的拼接(以及對字符串進行修改)實質上就是創建了一個新的String類對象:

而每次都要創建新對象,會占用大量的內存空間,效率非常低下,所以我們不推薦這樣來完成字符串的拼接,為了提高效率,我們使用StringBuilder和StringBuffer類來完成對字符串的修改。

3.2 StringBuilder和StringBuffer類

StringBuilder和StringBuffer的功能大部分是相同,我們這里就以StringBuilder來講。

3.2.1?append方法完成拼接

我們可以通過append來完成字符串的拼接(拼接在尾部,相當于String的"+"):

我們可以通過append來拼接多種類型,且返回值都是this(說明在原來的串上進行的修改,不會產生新的對象):

拼接完成后,我們可以調用StringBuilder中重寫的toString方法,使用String類型來接收生成的字符串:

這樣,可以減少額外對象的生成,大大的提高了效率!

3.2.2?StringBuilder和StringBuffer中的字符串修改方法

我們發現,在這兩大類中,提供了能夠修改字符串的方法,很方便的供我們使用。

例如reverse方法:

我們可以很輕松的在原來的字符串上完成字符的逆置。

例如insert方法:

我們可以在指定下標處完成插入。

注:這些方法都是在原本的字符串上進行的修改,不會生成新的對象,效率很高。

4、String、StringBuilder、StringBuffer的區別

1.String的內容不可被修改,StringBuilder和StringBuffer的內容可以被修改。

2.StringBuilder和StringBuffer的功能大體相同。

3.StringBuffer采用同步處理,屬于線程安全操作;而StringBuilder未采用同步處理,屬于線程不安全操作。(學習中,后面再說~)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18526.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18526.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18526.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【PB案例學習筆記】-10 進度條使用

寫在前面 這是PB案例學習筆記系列文章的第10篇,該系列文章適合具有一定PB基礎的讀者。 通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼,小凡都上傳到了gite…

Java用反射reflect來實例化對象: class.getDeclaredConstructor().newInstance()

Java用反射reflect來實例化對象: class.getDeclaredConstructor().newInstance() 從java9開始, class.newInstance()已過時, 被加上Deprecated強烈反對注解 SuppressWarnings("removal")CallerSensitiveDeprecated(since"9")public T newInstance()throws …

防止自動化攻擊的最佳實踐

防止自動化攻擊的最佳實踐 在當今的網絡安全環境中,保護用戶賬戶免受自動化攻擊已成為每個網站和應用程序的重要任務。攻擊者可以利用多種不同類型的自動化攻擊來嘗試破壞用戶賬戶。本文將詳細介紹常見的攻擊類型及其防御機制,幫助您更好地保護用戶賬戶…

C# ManualResetEvent的用法

在C#中,ManualResetEvent類是一個同步基元,用于控制多個線程的執行順序。下面是一些ManualResetEvent類的常見用法: 等待一個事件的發生:可以使用ManualResetEvent的WaitOne方法來等待事件的發生。當事件被觸發時,Wait…

adb 連接機頂盒命令

抓機頂盒日志的方法,使用此命令進行抓日志,個別無法抓日志的盒子可以使用此方法 1、安卓9.0版本查詢命令 ps -ef |grep com.cm.webos.iptv 2、安卓4.4版本查詢命令 ps |grep com.cm.webos.iptv 3、查詢順序:首先進入shell下進行操作 adb she…

C++青少年簡明教程:for循環語句

C青少年簡明教程:for循環語句 C的for循環語句是一種迭代控制語句,用于重復執行一段代碼。 語法格式: for(表達式1;表達式2;表達式3) 循環體 for循環語句執行流程圖: 不太好理解,請看下圖&am…

VSCode配置Lua5.4安裝

參考:VSCode 配置 Lua 開發環境(清晰明了)_lua vscode-CSDN博客 1.下載 Lua Binaries Download (sourceforge.net) 2.配置環境變量 解壓放到某文件夾: 環境變量: 3.VSCode安裝插件 4.配置 5.測試

Python | Leetcode Python題解之第116題填充每個節點的下一個右側節點指針

題目: 題解: class Solution:def connect(self, root: Node) -> Node:if not root:return root# 從根節點開始leftmost rootwhile leftmost.left:# 遍歷這一層節點組織成的鏈表,為下一層的節點更新 next 指針head leftmostwhile head:#…

快解析動態域名解析,實現外網訪問內網數據庫

今天跟大家分享一下如何借助快解析動態域名解析,在兩種特定網絡環境下,實現外網訪問內網mysql數據庫。 第1種網絡環境:路由器分配的是動態公網IP,且有路由器登錄管理權限。如何實現外網訪問內網mysql數據庫? 針對這種…

繼承與Object

一.繼承 Java語言的繼承:單繼承 1.類和類之間的關系 (1)組合關系 公司和員工,學校和學生 (2)繼承關系 學生和人 二.Object類 public class Object {private static native void registerNatives();static {registerNatives();} 1.finalize() 對象…

FPGA時鐘:驅動數字邏輯的核心

一、引言 在FPGA(現場可編程門陣列)設計中,時鐘信號是不可或缺的關鍵要素。時鐘信號作為時序邏輯的心跳,推動著FPGA內部各個存儲單元的數據流轉。無論是實現復雜的邏輯運算還是處理高速數據流,都需要精確的時鐘信號來保…

Vanna使用ollama分析本地MySQL數據庫

上一章節中已經實現了vanna的本地運行,但是大模型和數據庫都還是遠程的,因為也就沒辦法去訓練,這節一起來實現vanna分析本地mysql數據庫,因為要使用本地大模型,所以開始之前需要給本地安裝好大模型,我這里用…

WPF/C#:理解與實現WPF中的MVVM模式

MVVM模式的介紹 MVVM(Model-View-ViewModel)是一種設計模式,特別適用于WPF(Windows Presentation Foundation)等XAML-based的應用程序開發。MVVM模式主要包含三個部分:Model(模型)、…

期權具體怎么交易詳細的操作流程?

期權就是股票,唯一區別標的物上證指數,會看大盤吧,交易兩個方向認購做多,認沽做空,雙向t0交易,期權具體交易流程可以理解選擇方向多和空,選開倉的合約,買入開倉和平倉沒了&#xff0…

【Spring Cloud】API網關

目錄 什么是API網關為什么需要API網關前言問題列表 API網關解決了什么問題常見的網關解決方案NginxLuaSpring Cloud Netflix ZuulSpringCloud Zuul的IO模型弊端 Spring Cloud Gateway 第二代網關——GatewayGateway的特征Spring Cloud Gateway的處理流程Spring Cloud Gateway的…

數據集要點和難點以及具體應用案例

數據集(Data set),又稱為資料集、數據集合或資料集合,是一種由數據所組成的集合。它通常以表格形式出現,其中每一列代表一個特定變量,每一行對應于某一成員的數據集的問題。數據集列出的價值觀為每一個變量,如身高和體重的一個物體或價值的隨機數,每個數值被稱為數據資…

我的又一個神奇的框架——Skins換膚框架

為什么會有換膚的需求 app的換膚,可以降低app用戶的審美疲勞。再好的UI設計,一直不變的話,也會對用戶體驗大打折扣,即使表面上不說,但心里或多或少會有些難受。所以app的界面要適當的改版啊,要不然可難受死…

Android Surface對應的Buffer怎么傳遞給HWC

Android Surface對應的Buffer怎么傳遞給HWC 引言 因為要預研Android Video overlay,需要將SurfaceView對應的GraphicBuffer從drm_hwcomposer中剝離出來,這就需要們了解SurfaceView對應的GraphicBuffer的前世今生,以及它的數據流向以及在各個…

輕兔推薦 —— vfox

簡介 vfox 是一個跨平臺且可擴展的版本管理工具,終于有一個可以管理所有運行環境的工具了 - 支持一鍵安裝 Java、Node.js、Flutter、.Net、Golang、PHP、Python等多種環境 - 支持一鍵切換不同版本 特點 支持Windows(非WSL)、Linux、macOS! 支持不同項目不同版本、…

(四)事件系統

視頻鏈接:尚硅谷2024最新版微信小程序 文章目錄 事件綁定和事件對象事件分類以及阻止事件冒泡事件傳參-data-*自定義數據事件傳參-mark 自定義數據事件綁定和事件對象 小程序中綁定事件與在網頁開發中綁定事件幾乎一致,只不過在小程序不能通過 on 的方式綁定事件,也沒有 cli…