作為 Codegym 大學課程一部分的導師授課片段。報名參加完整課程。
“嗨,阿米戈!今天我們將分析一些涉及字符串的更常見的場景。例如,你知道如何將字符串拆分成幾個部分嗎?”
“我不會馬上告訴你,艾莉。但你會告訴我的,對吧?”
split()
方法
”有幾種方法可以做到這一點。第一種方法是將一個字符串拆分成多個部分,使用方法。split()
必須將定義特殊分隔字符串的正則表達式作為參數傳遞。您將了解正則表達式是什麼Java集合任務。
例子:
代碼 | 結果 |
---|---|
|
結果將是一個包含三個字符串的數組:
|
很簡單,但有時這種方法是多餘的。如果有很多定界符(例如,空格、換行符、製表符、句點),那麼您必須構建一個相當複雜的正則表達式。”
“好吧,當然。如果它難以閱讀,那麼就很難做出改變。
StringTokenizer
班級
作為 Codegym 大學課程一部分的導師授課片段。報名參加完整課程。
“Java 有一個特殊的類,它的全部工作就是將字符串拆分為子字符串。
“此類不使用正則表達式:相反,您只需傳入一個由定界符組成的字符串。這種方法的優點是它不會一次將整個字符串分成幾部分,而是從頭到尾移動一個一步一步。
該類有一個構造函數和兩個方法。我們向構造函數傳遞一個我們拆分成多個部分的字符串,以及一個由一組定界字符組成的字符串。
方法 | 描述 |
---|---|
|
返回下一個子串 |
|
檢查是否有更多的子字符串。 |
“這個類讓我想起了 Scanner 類,它也有nextLine()
和hashNextLine()
方法。
“你觀察得很好。你可以StringTokenizer
用這個命令創建一個對象:
StringTokenizer name = new StringTokenizer(string, delimiters);
其中 string 是要分成幾部分的字符串。而delimiters是一個字符串,其中的每一個字符都被當作一個分隔符。例子:
代碼 | 控制台輸出 |
---|---|
|
|
“請注意,在第二個字符串中傳遞給StringTokenizer
構造函數的字符串中的每個字符都被視為分隔符。
String.format()
方法和StringFormatter
類
“String 類的另一個有趣的方法是format()
。
“假設你有各種變量存儲數據。你如何在一行中將它們顯示在屏幕上?例如,我們有一些數據(左列)和所需的輸出(右列):
代碼 | 控制台輸出 |
---|---|
|
|
此類程序的代碼如下所示:
程序代碼 |
---|
|
“你會同意我的看法,代碼可讀性不是很好。如果變量名更長,那麼代碼會變得更加困難:
程序代碼 |
---|
|
“是的,這是一個艱難的閱讀!”
”別著急,這在現實程序中很常見,所以我想告訴你一種方法,可以把這段代碼寫得更簡單、更簡潔。
String.format
“這個String
類有一個靜態format()
方法:它讓你指定一個模式來用數據組裝一個字符串。命令的一般外觀如下:
String name = String.format(pattern, parameters);
例子:
代碼 | 結果 |
---|---|
|
|
|
|
|
|
“該方法的第一個參數是一個格式字符串,它包含所有需要的文本以及在需要插入數據的地方format()
稱為格式說明符(例如%d
和)的特殊字符。%s
"該format()
方法將這些%s
和%d
格式說明符替換為參數列表中格式字符串後面的參數。如果我們要插入一個字符串,那麼我們寫。%s
如果我們要插入一個數字,那麼格式說明符是%d
。示例:
代碼 | 結果 |
---|---|
|
s 等於"a=1, b=4, c=3" |
“這是一個簡短的格式說明符列表,可以在格式字符串中使用:
說明符 | 意義 |
---|---|
|
String |
|
整數:byte , short , int ,long |
|
實數:float ,double |
|
boolean |
|
char |
|
Date |
|
% 特點 |
"這些說明符指示數據的類型,但也有指示數據順序的說明符。要通過其編號獲取參數(編號從 1 開始),您需要編寫"%1$d "而不是" %d ”。示例:
代碼 | 結果 |
---|---|
|
s 等於"a=13, b=12, c=11" |
%3$d
將獲得第三個參數,%2$d
將獲得第二個參數,並將%d
獲得第一個參數。和格式說明符引用參數,而不管說明符%s
如或%d
%3$d
%2$s
字符串池
StringPool
》在程序運行時,代碼中指定的每一個字符串都存儲在一個叫做 的內存區域中。StringPool
是一個專門存儲字符串的數組。它的目的是優化字符串存儲:
“首先,代碼中指定的字符串必須存儲在某個地方,對嗎?代碼由命令組成,但數據(尤其是大字符串)必須與代碼分開存儲在內存中。只有對字符串對象的引用才會出現在代碼中。
“其次,所有相同的字符串文字只能在內存中存儲一次。這就是它的工作原理。當您的類代碼由 Java 機器加載時,如果所有字符串文字不存在,則將它們添加到內存中。如果它們StringPool
存在已經存在,那麼我們只需使用來自StringPool
.
因此,如果您在代碼中將相同的文字分配給多個 String 變量,那麼這些變量將包含相同的引用。文字將被添加到StringPool
唯一一次。在所有其他情況下,代碼將獲得對已加載到StringPool
.
以下是它的大致工作原理:
代碼 | 使用 StringPoll |
---|---|
|
|
“這就是為什麼a
和b
變量將存儲相同的引用。”
“我希望我理解正確。
intern()
方法。
“最好的部分是您可以通過編程方式將任何字符串添加到StringPool
. 為此,您只需要調用String
變量的intern()
方法。
“如果intern()
字符串StringPool
不存在,該方法會將字符串添加到StringPool
.
StringPool
“如果使用該方法添加兩個相同的字符串會發生什麼intern()
?”
“該方法將返回相同的引用。這可用於通過引用比較字符串。示例:
代碼 | 筆記 |
---|---|
|
|
|
|
您不太可能經常使用此方法。也就是說,人們喜歡在工作面試中詢問它。
“所以,知道總比不知道好。謝謝,艾莉!”
GO TO FULL VERSION