String 和 StringBuffer和 StringBuilder 場景應用

目錄

  • 1.三者區分
  • 2.String 不可變性的示例代碼:
  • 3.String 頻繁創建對象
  • 4.StringBuffer 是可變的,可以進行增刪改操作而不產生新的對象。
  • 5.StringBuffer 是線程安全的,適合在多線程環境下使用,但同步會帶來一定的性能損耗。 代碼舉例
  • 6.StringBuilder 也是可變的,與 StringBuffer 類似,但不是線程安全的。在單線程環境下,StringBuilder 的性能比 StringBuffer 更好。 代碼舉例
  • 7.各自應用場景

1.三者區分

String、StringBuffer 和 StringBuilder 都是 Java 中用于處理字符串的類,它們之間有一些重要的區別。

  1. String:

    • String 對象是不可變的,一旦創建就不能被修改。每次對 String 對象進行操作(連接、截取、替換等)都會創建一個新的 String 對象。
    • 這種不可變性使得 String 對象在多線程環境下更安全,但是如果需要頻繁地進行字符串操作,會產生大量的臨時對象,影響性能。
  2. StringBuffer:

    • StringBuffer 是可變的,可以進行增刪改操作而不產生新的對象。
    • StringBuffer 是線程安全的,適合在多線程環境下使用,但同步會帶來一定的性能損耗。
  3. StringBuilder:

    • StringBuilder 也是可變的,與 StringBuffer 類似,但不是線程安全的。在單線程環境下,StringBuilder 的性能比 StringBuffer 更好。

選擇使用場景:

  • 如果在單線程環境下進行大量字符串操作,并且不需要線程安全性,推薦使用 StringBuilder。
  • 如果在多線程環境下進行字符串操作,或者需要線程安全性,應該使用 StringBuffer。
  • 如果字符串基本不需要修改,或者只進行少量的操作,可以使用 String。

2.String 不可變性的示例代碼:

String 對象是不可變的,一旦創建就不能被修改。每次對 String 對象進行操作(連接、截取、替換等)都會創建一個新的 String 對象。 代碼舉例

String s1 = "Hello";
String s2 = s1 + ", World!";
String s3 = s2.substring(7);System.out.println(s1); // 輸出 "Hello"
System.out.println(s2); // 輸出 "Hello, World!"
System.out.println(s3); // 輸出 "World!"System.out.println(s1 == "Hello"); // 輸出 true
System.out.println(s2 == "Hello, World!"); // 輸出 false
System.out.println(s3 == "World!"); // 輸出 false

在這個示例中,我們首先定義了一個字符串 s1,然后將其與另一個字符串 "Hello, World!" 進行連接,生成一個新的字符串 s2。接著,我們從 s2 中截取了一個子字符串,得到 s3

需要注意的是,雖然我們對 s2s3 進行了操作,但是 s1 的值不會發生改變,因為 String 對象是不可變的。每次對 String 對象進行操作都會生成一個新的 String 對象,原來的對象不會被修改。

此外,在比較字符串是否相等時,不能使用 == 運算符,應該使用 equals() 方法進行比較。因為 == 運算符比較的是對象的引用,而 equals() 方法比較的是對象的內容。在上面的示例中,s1"Hello" 在內存中是同一個對象,因此 s1 == "Hello" 返回 true。而 s2"Hello, World!" 不是同一個對象,因此 s2 == "Hello, World!" 返回 false。

3.String 頻繁創建對象

這種不可變性使得 String 對象在多線程環境下更安全,但是如果需要頻繁地進行字符串操作,會產生大量的臨時對象,影響性能。 代碼舉例
以下是一個簡單的示例,演示在頻繁進行字符串操作時會產生大量臨時對象:

public class StringPerformanceExample {public static void main(String[] args) {long startTime = System.nanoTime();String result = "";for (int i = 0; i < 10000; i++) {result += "hello"; // 每次循環都會創建一個新的 String 對象}long endTime = System.nanoTime();long duration = (endTime - startTime) / 1000000; // 將納秒轉換為毫秒System.out.println("Duration: " + duration + " ms");}
}

在這個示例中,我們用一個循環將字符串 “hello” 連接了 10000 次,每次循環都會創建一個新的 String 對象。由于 String 對象的不可變性,每次連接操作都會產生一個新的 String 對象,這樣就產生了大量的臨時對象。

當我們運行上述代碼時,會發現花費的時間相對較長,這是因為頻繁地創建臨時對象會導致額外的內存開銷和垃圾回收壓力,從而影響性能。

為了避免這種情況,可以使用 StringBuilder 或 StringBuffer 類來代替頻繁操作字符串,因為它們是可變的,可以有效減少臨時對象的創建和提高性能。

4.StringBuffer 是可變的,可以進行增刪改操作而不產生新的對象。

下面是使用 StringBuffer 進行字符串操作的示例代碼:

public class StringBufferExample {public static void main(String[] args) {StringBuffer stringBuffer = new StringBuffer("Hello");System.out.println("Original: " + stringBuffer); // 輸出 "Hello"// 追加字符串stringBuffer.append(", World!");System.out.println("After append: " + stringBuffer); // 輸出 "Hello, World!" // 插入字符串stringBuffer.insert(5, "Beautiful ");System.out.println("After insert: " + stringBuffer); // 輸出 "Hello, Beautiful World!"// 替換字符串stringBuffer.replace(6, 15, "Wonderful");System.out.println("After replace: " + stringBuffer); // 輸出 "Hello, Wonderful World!"// 刪除字符串stringBuffer.delete(6, 16);System.out.println("After delete: " + stringBuffer); // 輸出 "Hello, World!"}
}

在這個示例中,我們首先創建了一個 StringBuffer 對象,并對其進行了追加、插入、替換和刪除操作。由于 StringBuffer 是可變的,這些操作都是在原對象上進行的,不會創建新的對象。因此,使用 StringBuffer 可以有效避免頻繁創建臨時對象的問題,提高性能。

5.StringBuffer 是線程安全的,適合在多線程環境下使用,但同步會帶來一定的性能損耗。 代碼舉例

下面是一個使用 StringBuffer 在多線程環境下進行字符串操作的示例代碼:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class StringBufferThreadExample {public static void main(String[] args) {StringBuffer stringBuffer = new StringBuffer();ExecutorService executorService = Executors.newFixedThreadPool(3);for (int i = 0; i < 3; i++) {executorService.execute(() -> {for (int j = 0; j < 10000; j++) {stringBuffer.append("hello"); // 追加字符串操作}});}// 關閉線程池executorService.shutdown();while (!executorService.isTerminated()) {// 等待所有任務完成}System.out.println("Result: " + stringBuffer.length()); // 輸出 30000}
}

在這個示例中,我們創建了一個 StringBuffer 對象,并使用線程池執行了 3 個線程,每個線程都會將字符串 “hello” 追加到 StringBuffer 中。由于 StringBuffer 是線程安全的,多個線程同時對其進行操作不會導致數據不一致的問題。

需要注意的是,在多線程環境下使用 StringBuffer 需要考慮同步的性能損耗。由于 StringBuffer 的方法都是 synchronized 的,會引入額外的同步開銷,可能會影響性能。如果不需要線程安全的操作,可以考慮使用 StringBuilder 類,它與 StringBuffer 類相似,但不提供同步機制,因此在單線程環境下性能更好。

6.StringBuilder 也是可變的,與 StringBuffer 類似,但不是線程安全的。在單線程環境下,StringBuilder 的性能比 StringBuffer 更好。 代碼舉例

下面是使用 StringBuilder 進行字符串操作的示例代碼:

public class StringBuilderExample {public static void main(String[] args) {StringBuilder stringBuilder = new StringBuilder("Hello");System.out.println("Original: " + stringBuilder); // 輸出 "Hello"// 追加字符串stringBuilder.append(", World!");System.out.println("After append: " + stringBuilder); // 輸出 "Hello, World!"// 插入字符串stringBuilder.insert(5, "Beautiful ");System.out.println("After insert: " + stringBuilder); // 輸出 "Hello, Beautiful World!"// 替換字符串stringBuilder.replace(6, 15, "Wonderful");System.out.println("After replace: " + stringBuilder); // 輸出 "Hello, Wonderful World!"// 刪除字符串stringBuilder.delete(6, 16);System.out.println("After delete: " + stringBuilder); // 輸出 "Hello, World!"}
}

與 StringBuffer 類似,StringBuilder 也是可變的,可以進行字符串的追加、插入、替換和刪除操作。不同的是,StringBuilder 不提供同步機制,并且在單線程環境下具有更好的性能。

因為沒有同步開銷,StringBuilder 的操作更快,適合在單線程環境下使用。如果不需要考慮線程安全問題,建議使用 StringBuilder 來執行字符串操作以提高性能。

7.各自應用場景

String、StringBuffer 和 StringBuilder 在 Java 中都用于處理字符串,它們各自的設計背景和主要應用場景如下:

  1. String固定變量:

    • String 是 Java 中的字符串類,使用不可變的字符序列來表示字符串。這意味著一旦創建了 String 對象,它的值就不能被修改。
    • 設計背景:String 類的不可變性使得它在多線程環境下是安全的,可以被共享和重用,這在并發編程中具有優勢。
    • 應用場景:適合表示不經常變化的字符串,例如常量字符串、配置信息等。
  2. StringBuffer多線程環境:

    • StringBuffer 也是用于表示字符串的類,與 String 不同的是,它是可變的,允許對字符串進行修改。
    • 設計背景:StringBuffer 被設計為線程安全的,它的方法都是使用 synchronized 關鍵字進行同步的,因此適合在多線程環境下使用。
    • 應用場景:適合在多線程環境下進行字符串操作的場景,但同步會帶來一定的性能損耗。
  3. StringBuilder單線程環境:

    • StringBuilder 也是可變的字符串類,與 StringBuffer 類似,但不提供同步機制,因此在單線程環境下性能更好。
    • 設計背景:StringBuilder 的設計目的是提供與 StringBuffer 類似的功能,但在單線程環境下具有更好的性能,因為它不需要同步開銷。
    • 應用場景:適合在單線程環境下進行字符串操作的場景,當不需要考慮線程安全問題時,可以使用 StringBuilder 來提高性能。

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

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

相關文章

聚類分析 | Matlab實現基于譜聚類(Spectral Cluster)的數據聚類可視化

聚類分析 | Matlab實現基于譜聚類(Spectral Cluster)的數據聚類可視化 目錄 聚類分析 | Matlab實現基于譜聚類(Spectral Cluster)的數據聚類可視化效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 1.Matlab實現基于譜聚類(Spectral Cluster)的聚類算法可視化&#xff08;完…

融云 Global IM UIKit

GlobalIM UIKit 基于多年領先的行業經驗&#xff0c;我們為開發者提供功能完備的單群聊 通信能力。“分鐘級”接入&#xff0c;即可得到符合海外用戶使用習慣的多端同步產品。 核心功能包括&#xff1a;快速接入、功能齊全、全球化交互體驗、內容審核、靈活可配置、高度自定義、…

c++詳解棧

一.什么是棧 堆棧又名棧&#xff08;stack&#xff09;&#xff0c;它是一種運算受限的數據結構&#xff08;線性表&#xff09;&#xff0c;只不過他和數組不同&#xff0c;數組我們可以想象成一個裝巧克力的盒子&#xff0c;你想拿一塊巧克力&#xff0c;不需要改變其他巧克…

基于AWS Serverless的Glue服務進行ETL(提取、轉換和加載)數據分析(二)——數據清洗、轉換

2 數據清洗、轉換 此實驗使用S3作為數據源 ETL: E extract 輸入 T transform 轉換 L load 輸出 大綱 2 數據清洗、轉換2.1 架構圖2.2 數據清洗2.3 編輯腳本2.3.1 連接數據源&#xff08;s3&#xff09;2.3.2. 數據結構轉換2.3.2 數據結構拆分…

FFmpeg開發筆記(六)如何訪問Github下載FFmpeg源碼

學習FFmpeg的時候&#xff0c;經常要到GitHub下載各種開源代碼&#xff0c;比如FFmpeg的源碼頁面位于https://github.com/FFmpeg/FFmpeg。然而國內訪問GitHub很不穩定&#xff0c;經常打不開該網站&#xff0c;比如在命令行執行下面的ping命令。 ping github.com 上面的ping結…

初識Linux:權限(1)

目錄 提示&#xff1a;以下指令均在Xshell 7 中進行 Linux 的權限 內核&#xff1a; 查看操作系統版本 查看cpu信息 查看內存信息 外部程序&#xff1a; 用戶&#xff1a; 普通用戶變為超級用戶&#xff1a; su 和 su-的區別&#xff1a; root用戶變成普通用戶&#…

KALI LINUX信息收集

預計更新 第一章 入門 1.1 什么是Kali Linux&#xff1f; 1.2 安裝Kali Linux 1.3 Kali Linux桌面環境介紹 1.4 基本命令和工具 第二章 信息收集 1.1 網絡掃描 1.2 端口掃描 1.3 漏洞掃描 1.4 社交工程學 第三章 攻擊和滲透測試 1.1 密碼破解 1.2 暴力破解 1.3 漏洞利用 1.4 …

什么是SSL證書?

當我們網上購物或銀行業務時&#xff0c;為了安全起見&#xff0c;我們希望看到網站的地址欄上有“HTTPS”和安全鎖圖標。但是這個“HTTPS”和鎖定圖標實際上意味著什么&#xff1f;要回答這些問題&#xff0c;我們需要了解 HTTPS、SSL 協議和 SSL 證書。 關于HTTPS、SSL和SSL…

風控反欺詐安全學習路標

1. 金融和支付領域知識 - 了解金融和支付領域的基本概念、業務流程和風險特點。 - 學習金融機構的監管要求和合規措施&#xff0c;如KYC&#xff08;了解你的客戶&#xff09;和AML&#xff08;反洗錢&#xff09;。 2. 數據分析和挖掘技術 - 學習數據分析和數據挖掘的基本原理…

fastadmin獲取關聯表數據select渲染

php public function piliangadd(){if (false === $this->request->isPost()) {$fenlei_list = Db::name(fenlei)->order(weigh desc)->select();$this</

每天五分鐘計算機視覺:稠密連接網絡(DenseNet)

本文重點 在前面的課程中我們學習了殘差網絡ResNet,而DenseNet可以看成是ResNet的后續,我們看一下圖就可以看出二者的主要區別了。 特點 DenseNet是一種卷積神經網絡,它的特點是每一層都直接連接到所有后續層。這意味著,每一層都接收來自前一層的輸出,并將其作為輸入傳遞…

Flyway——Oracle創建前綴索引

文章目錄 前言創建一般索引的語法前綴索引 前言 索引有助于提升數據庫表的查詢速率&#xff0c;極大的縮減查詢的時間。但索引的創建需要考慮的因素很多&#xff0c;并非索引越多越好&#xff01; 創建一般索引的語法 oracle創建一般的常見索引&#xff0c;語法如下所示&…

n個人排成一圈,數數123離隊

#include<stdio.h> int main() { int i, n100,k0,j0,a[1000]{0};//k&#xff1a;數數123的變量&#xff0c;j記錄離開隊列人數的變量scanf("%d",&n);for(int ii0; ii<n; ii){ for( i0; i<n; i){// printf("wei%d ",i);if((a[i]0)&&…

掌握Line多開技術,打造私人專屬空間

掌握Line多開技術&#xff0c;打造私人專屬空間 在現代社交網絡的時代&#xff0c;人們經常需要同時處理多個社交賬號&#xff0c;例如工作、家庭、朋友等不同領域的社交關系。而對于Line這樣的主流社交應用來說&#xff0c;多開技術可以讓用戶更便捷地管理多個賬號&#xff0…

數據結構線性表-棧和隊列的實現

1. 棧(Stack) 1.1 概念 棧&#xff1a;一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧 頂&#xff0c;另一端稱為棧底。棧中的數據元素遵守后進先出LIFO&#xff08;Last In First Out&#xff09;的原則。 …

Vue學習計劃-Vue2--Vue核心(三)methods和computed

Vue 1. 事件 v-on 基礎 使用 v-on:xxx或者xxx綁定事件&#xff0c;其中xxx是事件名 事件的回調需要配置在methods對象中&#xff0c;最終會在vm上 methods中配置函數&#xff0c;不要用箭頭函數&#xff0c;否則this就不是vm了 methods中配置函數&#xff0c;都是被Vue管…

Seata使用

本文以seata-server-1.5.2&#xff0c;以配置中心、注冊中心使用Nacos&#xff0c;store.modedb&#xff08;mysql&#xff09;為例進行操作。 一、Seata Server端 1、下載seata server 鏈接: http://seata.io/zh-cn/blog/download.html下載壓縮包&#xff0c;解壓至非中文目錄…

Java技術棧 —— 微服務框架Spring Cloud —— Ruoyi-Cloud 學習(一)

Ruoyi-cloud 項目學習 一、項目環境搭建與啟動1.1 nacos安裝部署1.1.1 nacos安裝、啟動1.1.2 nacos部署 1.2 seata安裝部署1.3 后端部署與運行1.3.1 ruoyi-modules-file模塊運行報錯 1.4 nginx安裝、部署、配置與啟動1.5 redis安裝與部署1.6 前段框架知識1.7 項目啟動1.8 參考 …

實用方法 | 搭建真正滿足用戶需求的在線幫助中心

隨著互聯網的普及和信息技術的快速發展&#xff0c;客戶服務和支持變得越來越重要。為了提高客戶滿意度和維持良好的品牌形象&#xff0c;越來越多企業都開始搭建自己的在線幫助中心。 不知從何下手&#xff1f;細想一下&#xff0c;搭建在線幫助中心主要就是為了解決用戶的問…

根據java類名找出當前是哪個Excel中的sheet

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …