String解析及其方法

来源:https://www.cnblogs.com/prettyspider/archive/2023/06/30/17517224.html
-Advertisement-
Play Games

#String解析及其方法 1.[前言](#jump1) 2.[什麼是字元串(String)](#jump2) 3.[字元串(String)的兩種創建方式及其區別](#jump3) 4.[字元串(String)的方法及其部分原碼解析](#jump4) 5.[字元串(String)的弊端](#jump ...


String解析及其方法

1.前言
2.什麼是字元串(String)
3.字元串(String)的兩種創建方式及其區別
4.字元串(String)的方法及其部分原碼解析
5.字元串(String)的弊端

1.前言

String 類代表字元串。Java 程式中的所有字元串字面值(如 "abc" )都作為此類的實例實現。
字元串是常量;它們的值在創建之後不能更改。字元串緩衝區支持可變的字元串。因為 String 對象是不可變的,所以可以共用

2.什麼是字元串(String)

String類表示字元串,在創建之後不能被更改,可用於檢查序列的單個字元,搜索字元串,提取字元串,創建字元串副本並將所有字元串全部轉換為大寫或小寫。

3.字元串(String)的兩種創建方式及其區別

字元串有兩種創建方式,分別為直接賦值和構造方法。
字元串在創建之後便不會被更改,對於字元串內容的操作都會新創建一個字元串對象

1.直接複製

以雙引號內的數據作為字元串存儲的數據

String str="hello world";

2.四種構造方法

1.新建一個空字元串

初始化一個新創建的 String 對象,使其表示一個空字元序列

String str1=new String();
空字元串和null的區別
String str2=new String();
String str3=null;

空字元串和null的值都為空
空字元串表示字元串對象引用的值為空,如上str2的值為空,str1指向字元串的記憶體空間
null表示引用為空,如上str3的引用為空,str3沒有指向任何空間
在實際中作用
對字元串的校驗過程中,要考慮字元串值的兩種"空",既要考慮字元串引用對象值是否為空,又要考慮引用對象是否為空

2.新建String的字元串

初始化一個新創建的 String 對象,使其表示一個與參數相同的字元序列;換句話說,新創建的字元串是該參數字元串的副本

String str4=new String("hello world");

生成的str4是對應參數字元串的副本,但str4是對應新創建的對象

3.新建字元數組的字元串,輸出時會自動將數組拼接成字元串

分配一個新的 String,使其表示字元數組參數中當前包含的字元序列

char[] chars={'a','b','c'};
String str5=new String(chars);

適用場景:用於改變字元串的數據
由於字元串在創建之後不能被修改,而字元串沒有相應的改變字元串的方法,但是由獲取對應索引的數據和將數據轉化為字元數組的形式,通過該構造方法可以將字元串的數據進行修改

4.新建位元組數組的字元串,輸出時會自動將數組拼接成字元串

通過使用平臺的預設字元集解碼指定的 byte 數組,構造一個新的 String

byte[] bytes={97,98,99};
String str6=new String(bytes);

使用場景:用於網路中的數據傳輸,將位元組信息轉化為字元串時使用
網路中的數據是位元組類型,通過該方法可以將位元組信息轉化為字元串形式再進行處理

3.兩者的區別

1.存儲

直接賦值:直接賦值進入棧記憶體中,會進入堆記憶體的串池中查看是否有相同地址的數據,沒有便創建,有的話便復用
構造方法:每new一次便會在堆記憶體中開闢一個新的空間,生成新對象,不同對象的地址不同

2.字元串的對比

image
結果為
image
== 用於比較地址是否相等,equals用於比較具體的值

4.字元串(String)的方法及其部分原碼解析

1. boolean equals(Object anObject)

給定對象表示的 String 與此 String 相等,則返回 true;否則返回 false
源碼解釋

 public boolean equals(Object anObject) {
 	//比較當前對象(this)與給定對象(anObject)的地址是否相等
        if (this == anObject) {
            return true;
        }
	//判斷anObject是否是String的實例
        if (anObject instanceof String) {
		//將anObject強制轉化為String
            String anotherString = (String)anObject;
		//獲取當前對象對應的字元數據的長度
            int n = value.length;
		//判斷n與給定對象對應的字元數組的長度是否相等
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
		//比較字元數組對應位置的數據是否相等
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

2.char charAt(int index)

返回指定索引處的 char 值。索引範圍為從 0 到 length() - 1。序列的第一個 char 值位於索引 0 處,第二個位於索引 1 處,依此類推,這類似於數組索引

    public char charAt(int index) {
	//判斷index是否在給定的索引範圍之內,若不在則拋出字元串角標越界
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
	//如果在對應的範圍內,則獲取對應的字元數組對應縮影的數據
        return value[index];
    }

3.public int length()

返回此字元串的長度

    public int length() {
	//返回對應對象字元數組的長度
        return value.length;
    }

4.public String concat(String str)

將指定字元串連接到此字元串的結尾。
如果參數字元串的長度為 0,則返回此 String 對象。否則,創建一個新的 String 對象,用來表示由此 String 對象表示的字元序列和參數字元串表示的字元序列連接而成的字元序列

 public String concat(String str) {
 	//判斷str是否為空
        if (str.isEmpty()) {
            return this;
        }
        int len = value.length;
        int otherLen = str.length();
	//複製當前對象的值,並指定長度為len+otherLen
        char buf[] = Arrays.copyOf(value, len + otherLen);
	//將str的值添加到buf之後,getChars()的底層是System的arraycopy()
        str.getChars(buf, len);
        return new String(buf, true);
    }

通常使用"+",和concat()的底層原理是一樣

5.public String substring(int beginIndex,int endIndex)

返回一個新字元串,它是此字元串的一個子字元串。該子字元串從指定的 beginIndex 處開始,直到索引 endIndex - 1 處的字元。因此,該子字元串的長度為 endIndex-beginIndex

 public String substring(int beginIndex, int endIndex) {
	 //判斷給定的起始索引和終止索引是否符合要求
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        int subLen = endIndex - beginIndex;
	//判斷終止索引是否大於起始索引
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
	//判斷起始索引和終止索引是否對應於字元串對應的字元數組的起始位置和終止位置,如果是,便返回對應的字元串,否則便返回索引的數據
        return ((beginIndex == 0) && (endIndex == value.length)) ? this: new String(value, beginIndex, subLen);
    }

方法的重載
public String substring(int beginIndex)
返回一個新的字元串,它是此字元串的一個子字元串。該子字元串從指定索引處的字元開始,直到此字元串末尾。

6.public String replace(char oldChar,char newChar)

返回一個新的字元串,它是通過用 newChar 替換此字元串中出現的所有 oldChar 得到的。
如果 oldChar 在此 String 對象表示的字元序列中沒有出現,則返回對此 String 對象的引用。否則,創建一個新的 String 對象,它所表示的字元序列除了所有的 oldChar 都被替換為 newChar 之外,與此 String 對象表示的字元序列相同

 public String replace(CharSequence target, CharSequence replacement) {
 	//運用正則表達式對字元串進行替換
 	return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
 }

5.字元串(String)的弊端

由於字元串一旦創建後便不能更改,因此在進行字元串的拼接過程中,會不斷產生新的對象,對於記憶體的消耗大,同時,進行字元串的反轉,過程複雜,記憶體的消耗大,因此需要其他的字元串類


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

-Advertisement-
Play Games
更多相關文章
  • 前言 現在很多網頁用的都是固定標題欄,就像這樣: 很多網站為了相容小視窗還會做個JS適配: 但是如果視窗比這還小的話... 那就只剩下一部分了。 由於設置position:fixed後元素不會隨著滾動條滾動,所以超出頁面邊緣的部分將永遠看不見,除非增大視窗或縮小顯示比例。 很多設計師忘記考慮這一點了 ...
  • vue3插槽Slots 在 Vue3 中,插槽(Slots)的使用方式與 Vue2 中基本相同,但有一些細微的差異。以下是在 Vue3 中使用插槽的示例: // ChildComponent.vue <template> <div> <h2>Child Component</h2> <slot></ ...
  • 儘管寫過 outlet 路由的配置。 考慮到 token 判定和 路由頁 變更,我不瞭解v6是不是有更詳解的做法。 決定調一下配置,期望 在任何頁面非同步更新時,token 都可以在跳轉前 被檢測到,防止無 token 跳轉發生。 補上404頁面( 地址欄 頁面不存在時,展示404頁面 ) ![](h ...
  • [回到目錄](https://www.cnblogs.com/lori/p/3896484.html) # 說明 複合的責任鏈,類似於管道模式,只要符合條件,說會向下傳遞,不會終止 # 演算法說明 * 按最高優先順序去使用,符合就用,不符合就走下一個策略 * 具體鏈條,有點像pipeline管道模式 * ...
  • 業界有很多大促活動,像618、雙11、雙12等等。每一次大促不只是給業務帶來了新高,對於技術同樣也有很重要的意義,縱觀一些優秀的技術團隊,都是跟著業務一起成長的。在高併發大流量的背景下,如何支撐好業務運營,是一件很有挑戰性的事情,它可以從多方面檢驗我們的技術能力,對我們的系統架構和應急保障都提出了很... ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202306/3076680-20230628115834099-2000661347.png) # 1. 握手 ## 1.1. 發送方和接收方之間的信號傳遞過程 ## 1.2. 模擬數據機使用一種握手形式 ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本文是《JavaCV的攝像頭實戰》系列的 ...
  • 某日二師兄參加XXX科技公司的C++工程師開發崗位第30面: > 面試官:什麼是空指針? > > 二師兄:一般我們將等於`0`/`NULL`/`nullptr`的指針稱為空指針。空指針不能被解引用,但是可以對空指針取地址。 ```c++ int* p = nullptr; //空指針 *p = 42 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...