主頁 > 後端開發 > String決議及其方法

String決議及其方法

2023-07-01 07:44:18 後端開發

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)的弊端

由于字串一旦創建后便不能更改,因此在進行字串的拼接程序中,會不斷產生新的物件,對于記憶體的消耗大,同時,進行字串的反轉,程序復雜,記憶體的消耗大,因此需要其他的字串類

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556402.html

標籤:其他

上一篇:開源通用高性能的分布式id序列組件

下一篇:返回列表

標籤雲
其他(161922) Python(38266) JavaScript(25517) Java(18286) C(15238) 區塊鏈(8274) C#(7972) AI(7469) 爪哇(7425) MySQL(7278) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4609) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1985) HtmlCss(1979) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • String決議及其方法

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

    uj5u.com 2023-07-01 07:44:18 more
  • 開源通用高性能的分布式id序列組件

    業務資料的存盤,少不了資料記錄的id序列,id序列(或稱序列)的生成方式有很多種,比如當前時間戳、資料庫的序列值(Oracle的序列,MySQL的自增ID等)、UUID等方式,但這些生成方式均存在一定的局限性,本文介紹一種通用高性能的分布式id序列的設計思路…… ......

    uj5u.com 2023-07-01 07:44:09 more
  • Java-語法基礎

    > JDK8 > > 復習用 ## Java前置知識 1. JavaSE Java Standard Edition 標準版 支持面向桌面級應用(如Windows下的應用程式)的 Java平臺,提供了完整的Java核心API 此版本以前稱為 J2SE 2. JavaEE Java Enterpris ......

    uj5u.com 2023-07-01 07:43:49 more
  • Java基礎語法

    1、Java的八種基本資料型別 1、byte 1位元組 取值范圍:-128~127 2、short 2位元組 取值范圍:-32768~32767 3、int 4位元組 取值范圍:-231~231-1 # int是開發中最常用的,也是Java中默認的資料型別 4、long 8位元組 取值范圍:-263~263 ......

    uj5u.com 2023-07-01 07:43:33 more
  • 微信小程式訂閱模板訊息推送

    **背景** 在實際的小程式開發程序中往往需要用到給用戶發送訂閱訊息,比如:我們在店里掃碼點餐時在付款時往往彈出一個授權視窗(比如‘取餐通知’)這個時候我們就需要對接微信小程式的模板訊息。 [https://developers.weixin.qq.com/miniprogram/dev/OpenA ......

    uj5u.com 2023-07-01 07:43:29 more
  • 記一次Native memory leak排查程序

    路由計算服務是路由系統的核心服務,負責運單路由計劃的計算以及實操與計劃的匹配。在運維程序中,發現在長期不重啟的情況下,有TP99緩慢爬坡的現象。此外,在每周例行調度的試算程序中,能明顯看到記憶體的上漲。 ......

    uj5u.com 2023-07-01 07:43:24 more
  • 狂收 3.2k star!百度開源壓測工具,可模擬幾十億的并發場景,太強悍了

    dperf 是一款基于 DPDK 的 100Gbps 網路性能和負載測驗軟體,能夠每秒建立千萬級的 HTTP 連接、億級別的并發請求和數百 Gbps 的吞吐量。 ## 優點 ### 性能強大: - 基于 DPDK,使用一臺普通 x86 服務器就可以產生巨大的流量:千萬級的 HTTP 每秒新建連接數, ......

    uj5u.com 2023-07-01 07:43:20 more
  • 在python中實作使用迭代生成器yield減少記憶體占用的方法

    在python編碼中for回圈處理任務時,會將所有的待遍歷參量加載到記憶體中。其實這本沒有必要,因為這些參量很有可能是一次性使用的,甚至很多場景下這些參量是不需要同時存盤在記憶體中的,這時候就會用到本文所介紹的迭代生成器yield。 ### 1.基本使用 首先我們用一個例子來演示一下迭代生成器yield ......

    uj5u.com 2023-07-01 07:43:16 more
  • 使用Python字串訪問與修改區域變數

    在Python中定義一個函式時,就會把變數空間劃分為全域變數(global)與區域變數(local),如果是定義在一個類的成員函式中,那么就還有額外的成員變數(self)空間。那么,如果在實際操作中,想把這幾種不同的變數空間做一個分離的話,有沒有辦法呢? ### 1.讀取和修改區域變數 首先來看一下 ......

    uj5u.com 2023-07-01 07:43:11 more
  • Python Django Web開發實戰

    # Python Django全面介紹 Django是一個非常強大的Python Web開發框架,它以"快速開發"和"干凈、實用的設計"為設計宗旨。本文將從Django的基本概念開始,逐漸引導大家理解如何使用Django構建復雜的web應用程式。 ## Django基本概念與原理 首先,讓我們從Dj ......

    uj5u.com 2023-07-01 07:43:07 more