【Java SE】 String、StringBuff和StringBuilder

🥰🥰🥰來都來了,不妨點個關注叭!

👉博客主頁:歡迎各位大佬!👈

在這里插入圖片描述

文章目錄

  • 1. 字符串不可變性
    • 1.1 設計不可變
    • 1.2 修改字符串創建新對象
    • 1.3 為什么字符串不可變
    • 1.4 String類設計不可變的好處
    • 1.5 字符串的修改
  • 2. 如何查看反編碼?
  • 3. StringBuff和StringBuilder
  • 4. 常考面試題

1. 字符串不可變性

String是一種不可變對象,即字符串中的內容是不可改變,它們的內容被創建好后,就不能被修改了!
為什么呢~

1.1 設計不可變

String類在設計時是不可改變,String類實現描述中已說明,以下來自JDK1.8String類的部分實現,如下圖:
在這里插入圖片描述
在這里插入圖片描述
1)String類中的字符實際保存在內部維護的value字符數組中
2)String類被?nal修飾,表示String類不能被繼承
3)value被?nal修飾,表示value自身的值不能改變,即不能引用其它字符數組,但其引用空間中的內容可以修改

1.2 修改字符串創建新對象

所有涉及到可能修改字符串內容的操作都是創建一個新對象,改變的是新對象
字符串的不可變性,字符串中的內容是不可改變,如修改了則是創建了新對象,改變的是新對象

1.3 為什么字符串不可變

誤區
認為字符串不可變是因為其內部保存字符的數組value被?nal修飾了,因此不能改變
這種說法是錯誤的,不是因為String類自身被final修飾,也不是因為其內部value被?nal修飾而不能被修改
正解
?nal修飾類表明該類不想被繼承,?nal修飾引用類型表明該引用變量不能引用其他對象,但其引用對象中的內容可以修改,“看起來String可變”,其實創建了新對象!!!

public class Test17 {public static void main(String[] args) {final int array[] = {1,2,3,4,5};array[0] = 100;System.out.println(Arrays.toString(array));array = new int[]{7,8,9};// 編譯報錯:Error:(15, 9) java: 無法為最終變量array分配值}
}

在這里插入圖片描述
由上述代碼進一步理解:可以修改對象引用的內容,但是無法更改引用的指向!!!

1.4 String類設計不可變的好處

為什么String類要設計成不可變的呢~
原因有以下3點:

  1. 從字符串對象池來說,方便實現字符串對象池,如果 String 可變,對象池就需要考慮寫時拷貝的問題,變得復雜
  2. 從線程安全角度來說,不可變對象是線程安全的
  3. 從緩存角度來說,不可變對象更方便緩存 hash code, 作為 key 時可以更高效的保存到 HashMap中

1.5 字符串的修改

以下這種方式不推薦使用!!!
原因效率極低,中間創建好多臨時對象,空間的占用

public class Test {public static void main(String[] args) {String s = "hello ";s += "world!";System.out.println(s);}
}

打印結果如下:
在這里插入圖片描述
在上述代碼過程中,查看反編碼,具體過程分析如下圖:
在這里插入圖片描述
StringBuilder的構造方法如下:
在這里插入圖片描述
可想而知,如果放在循環體中這樣修改字符串,中間會創建好多臨時變量
注意】盡量避免直接對String類型對象進行修改,String類不能修改,所有的修改都會創建新對象,效率非常低
String類進行修改時,效率非常慢,所以需要盡量避免對String的直接使用修改,如果要修改建議盡量使用StringBu?er或者StringBuilder,接下來StringBu?er和StringBuilder閃亮登場!

2. 如何查看反編碼?

上面的反編碼是如何進行查看的呢?下面是保姆級教程!!!
步驟
1)首先運行該程序!!!
在這里插入圖片描述
2)找到文件所在位置
在這里插入圖片描述
3)找到字節碼文件
進入到這個界面,我們需要找到.class文件,即字節碼文件
在這里插入圖片描述
在這里插入圖片描述
4 )輸入cmd
在這里插入圖片描述
5)輸入 javap -c Test15
在這里插入圖片描述
注意事項】javap -c Test15中Test15是該程序的類名,請輸入你自己的類名哦~

3. StringBuff和StringBuilder

由于String的不可更改特性,為方便字符串的修改,Java中又提供StringBuilder和StringBu?er類這兩大類,這兩個類大部分功能是相同的
這里介紹 StringBuilder和StringBuff常用的一些方法:
在這里插入圖片描述
其它方法需要用到可參閱Java在線文檔
以下為上述方法的具體使用,更深入了解其方法~

public class Test {public static void main(String[] args) {StringBuilder sb1 = new StringBuilder("hello");StringBuilder sb2 = sb1;//append追加即尾插(字符、字符串、整形數字)sb1.append(' ');                  //hellosb1.append("world");              //hello worldsb1.append(1);                    //hello world1System.out.println(sb1);          //hello world1System.out.println(sb1 == sb2);   //trueSystem.out.println(sb1.length());    //獲取字符串的有效長度12System.out.println(sb1.capacity());  //獲取底層數組的總大小sb1.setCharAt(0, 'H');     //設置任意位置的字符 Hello world1sb1.insert(0, "Hello world!!!");         //Hello world!!!Hello world1System.out.println(sb1);System.out.println(sb1.indexOf("Hello"));          //獲取Hello第一次出現的位置System.out.println(sb1.lastIndexOf("hello"));  	   //獲取hello最后一次出現的位置sb1.deleteCharAt(0);                               //刪除首字符sb1.delete(0,5);                                   //刪除[0, 5)范圍內的字符String str = sb1.substring(0, 5);                  //截取[0, 5)區間中的字符以String的方式返回System.out.println(str);sb1.reverse();                      //字符串逆轉str = sb1.toString();               //將StringBu?er以String的方式返回System.out.println(str);}
}

在很多題目中,StringBuilde.append()方法經常使用到,應用于那些經常要修改的字符串中,還是相當方便噠~
注意事項
String和StringBuilder類不能直接轉換。如果想互相轉換,采用如下原則:

String—>StringBuilder: 1)利用StringBuilder的構造方法 2) append()方法
StringBuilder—>String: 調用toString()方法

4. 常考面試題

String、StringBu?er、StringBuilder的區別

  1. 內容上,String的內容不可修改,StringBu?er與StringBuilder的內容可以修改
  2. 功能上,StringBu?er與StringBuilder大部分功能是相似的
  3. 線程安全上,StringBu?er采用同步處理,屬于線程安全操作;而StringBuilder未采用同步處理,屬于線程不安全操作

解釋說明
對線程安全來說,StringBu?er線程安全,可以在多線程下使用,StringBuilder線程不安全在單線程下使用,那么都用StringBu?er不就好了嘛~不需要考慮線程安全問題了
不行!!!會浪費很多資源,加鎖和釋放鎖都會浪費資源!
💛💛💛本期內容回顧💛💛💛
在這里插入圖片描述
???本期內容到此結束啦~

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

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

相關文章

在Docker中使用GPU

一、安裝nvidia-container-toolkit 總之一句話:nvidia-docker和nvidia-docker2,nvidia-container-runtime 已經被英偉達迭代了,可以認為nvidia-container-toolkit是nvidia-docker和nvidia-docker2, nvidia-container-runtime 的替…

Vue3項目練習詳細步驟(第三部分:文章分類頁面模塊)

文章分類列表 主體結構 接口文檔 文章分類列表查詢接口數據綁定 Pinia狀態管理庫 axios請求攔截器 Pinia持久化插件-persist 未登錄統一處理 添加文章分類 主體結構 接口文檔 綁定請求數據 編輯文章分類 彈框結構 數據回顯 接口文檔 綁定請求數據 刪除分類 …

前端中var、let 或 const區別

前端中var、let 或 const區別 一、前言1.var2.let3.const4.總結 一、前言 當涉及 JavaScript 中的變量聲明時,開發人員通常會面臨選擇使用 var、let 或 const。雖然它們都可以用來聲明變量,但在實際應用中,它們之間有一些重要的區別。接下來…

在window中使用HTTP服務器獲取kali的文件

文章目錄 一、在window中使用HTTP服務器獲取kali的文件1、疑問2、執行條件3、成功讀取 一、在window中使用HTTP服務器獲取kali的文件 1、疑問 有時候kali上面有的文件想傳入window但是發現不允許這樣操作那怎么辦呢?特別是在一些限制工具的比賽中想把kali的文件傳…

數字化學校渠道的建造內容

數字化學校渠道的建造內容可以用階段來區分: 1.網絡硬件為主的建造 這一階段首要重視的是學校網絡的硬件基礎建造,一起供給部分網絡根本服務,與此一起,也進行部分信息使用內容的建造,如電子閱覽室、歸納管理信息體系等…

Android 圖片加載glide庫 一次通關

前言 Glide是一個由Bumptech開發的開源圖片加載庫,專門用于Android平臺。它被廣泛應用于Android應用中,以簡化圖片加載過程,并提高性能和效率。 Glide能夠快速加載圖片,同時減少頁面加載時間和內存消耗。Glide具有強大的緩存機制…

國產操作系統上apt命令詳解 _ 統信 _ 麒麟 _ 中科方德

原文鏈接:國產操作系統上apt命令詳解 | 統信 | 麒麟 | 中科方德 Hello,大家好啊!今天給大家帶來一篇在國產操作系統上使用apt命令的詳解文章。apt(Advanced Package Tool)是Debian及其衍生發行版(如統信UOS…

網絡流量監控:解讀網絡性能的關鍵

目錄 什么是網絡流量監控? 網絡流量監控的原理 網絡流量監控的應用 AnaTraf網絡流量分析儀簡介 結語 在當今數字化時代,網絡已成為人們日常生活和商業運營的核心。隨著企業和個人對網絡的依賴程度不斷增加,確保網絡穩定性和性能已成為至…

如何在JavaScript中檢查字符串是否包含子字符串?

在JavaScript中檢查一個字符串是否包含某個子字符串是一個常見任務。本文將介紹幾種實現該功能的方法,包括傳統方法和高級算法。 使用 indexOf() 方法 最基礎和常見的方法是使用 indexOf() 方法。該方法返回字符串在另一個字符串中的起始位置,如果未找…

TPshop商城的保姆教程(windows)

提前準備 phpStudy下載:https://www.xp.cn/download.html 選擇適合自己的版本下載 TPshop商城源文件下載鏈接: https://pan.baidu.com/s/143fLrxbwe9CTMCbyx7mXJQ?pwd6666 開始安裝 安裝完phpstudy后 以管理員的身份啟動phpstudy.exe 選擇合適自己…

2024年03月 Python(六級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Python等級考試(1~6級)全部真題?點這里 一、單選題(共25題,共50分) 第1題 以下選項中,創建類正確的是?() A: class test1: def prt(self): …… B: class Mg(): def__init__(na,ag): self.na=na C: class A(): def print(self): print(“Yes”) a=A() a.print() D…

【好書推薦,持續更新~~】

書籍推薦,持續更新~~ 1.《只是為了好玩: Linux之父林納斯自傳》-- Linus Torvalds, David Diamond Linux之父Linus Torvalds的自傳,也是Linus唯一一本書。Linus以調侃的語氣講述了自己的成長經歷,在他看來,一切都是為了好玩兒&am…

【Vue】v-bind屬性綁定指令

作用:動態設置html的標簽屬性 比如:src、url、title 默認情況下是單向的 語法: v-bind:屬性名"表達式"v-bind:可以簡寫成 > : 比如,有一個圖片,它的 src 屬性值,是一個圖片地址。這個地址…

Android SDK下載安裝(_指定版本)

安裝完sdk,就可以直接使用adb命令了,如果想做app相關自動化測試,也是需要sdk環境依賴的 一、SDK下載 A:官網下載: 管內鏡像網站(推薦):https://www.androiddevtools.cn/index.html 官網:htt…

2024-5-9——給植物澆水 II

2024-5-9 題目來源我的題解方法一 雙指針 題目來源 力扣每日一題;題序:2105 我的題解 方法一 雙指針 使用兩個指針t1和t2記錄Alice和Bob當前還未澆水的植物,使用變個變量cap1和cap2表示Alice和Bob當前剩余的水量。 兩端同時澆水&#xff0…

滲透測試一些知識點

1、如果提示缺少參數,如{msg:params error},可嘗使用字典模糊測試構造參數,進一步攻擊。 2、程序溢出,int最大值為2147483647,可嘗試使用該值進行整數溢出,觀察現象。 3、403,404響…

如何使用MATLAB寫測試(2)Negative Test

如何使用MATLAB寫測試(2)Negative Test 原文:如何使用MATLAB寫測試(2)Negative Test - 知乎 (zhihu.com) 上一篇請參見 如何使用MATLAB寫測試(1) - 知乎專欄 上一篇中,我們的實習…

【YashanDB知識庫】ODBC驅動類問題定位方法

【標題】ODBC驅動類問題定位方法 【需求分類】故障分析 【關鍵字】ODBC 【需求描述】由于我們的ODBC接口目前尚不完善,經常會遇見ODBC接口能力不足導致應用功能無法運行的問題,需要定位手段確定底層是哪個接口報錯 【需求原因分析】方便一線數據庫管…

【python】修改目標檢測的txt標簽(yolo)的類別ID映射

腳本功能: 針對目錄下的所有yolo格式的txt標簽文件,將class類別的id修改為指定id。 實際應用常見不多 代碼 # -*- coding: utf-8 -*- # Time : 2023/9/11 10:58 # Author : CLW # FileName: change_txt_label.py # Software: PyCharmimport os 算法功…

markdown語法保存

這里寫自定義目錄標題 歡迎使用Markdown編輯器新的改變功能快捷鍵合理的創建標題,有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、居右SmartyPants 創建一個自定義列表如何創建一個…