溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java字符串的定義和用法

發(fā)布時間:2021-07-07 14:09:24 來源:億速云 閱讀:154 作者:chen 欄目:編程語言

本篇內(nèi)容介紹了“Java字符串的定義和用法”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

Java字符串的定義和用法

 前言

Java 基本類型可謂是 Java 世界里使用最頻繁的數(shù)據(jù)類型了。除此之外,有種數(shù)據(jù)類型你也一定會遇到,它在 Java 世界里使用也相當頻繁。它就是字符串!

聽到字符串,你是不是想起了字符這種類型。不過在 Java 里,字符和字符串是兩種不同的類型。

字符串的定義與形式

字符類型你應(yīng)該比較熟悉,通過關(guān)鍵詞 char 來申明一個字符。

值只能是一個英文字符或者一個中文字符或者是 Unicode 編碼,用單引號包住。如下:

// char 用 ascii 字符賦值  char charWithAscii = '.';  char charWithZh = '牛';  char a = '\u0041';// 值為 A

而字符串,顧名思義,就是多個字符連接而成的串。通過關(guān)鍵詞 String  來聲明一個字符串。

值可以是 null 或者空字符串或者單字符串或者多字符串,用雙引號包住。如下:

// null 字符串,未指定地址  String nullnullStr = null;  // 空字符串,包含 0 個字符  String  blankStr = "";  // 包含一個字符  String oneCharStr = "A";  // 包含多個字符,打印 蝸牛666 A  String multiCharStr = "蝸牛666 \u0041";

你會發(fā)現(xiàn)字符串的值可以是 null,因為字符串類型 String 是引用類型,值為 null,就說明值不存在,也就是這個變量不指向任何對象。這也是它和基本類型 char 的區(qū)別所在。

那作為引用類型,String 就可以通過 new 的方式聲明,比如:

String newnewStr = new String("蝸牛666");

另外,你也會發(fā)現(xiàn)字符串比字符存儲了更豐富的數(shù)據(jù),實際上,一個字符串可以存儲 0 到任意多個字符。只要把數(shù)據(jù)內(nèi)容用雙引號包起來就好。

不過,如果你的數(shù)據(jù)內(nèi)容本身就有雙引號,會發(fā)生什么呢?

Java字符串的定義和用法

沒錯,連編譯都過不去!編譯器會提示你字符串非法行尾,因為編譯器判斷的時候,會把中間引號當成字符串結(jié)尾,導(dǎo)致第三個引號開始的字符串語法出錯。

那此時就要用到轉(zhuǎn)義字符了,這個 case 里可以通過反斜杠 \ 轉(zhuǎn)義中間的引號。

String str = "蝸牛666\"";

這樣就不會報錯了。

字符串的存儲方式

我們知道,程序在運行時,會針對不同類型的變量數(shù)據(jù)做運算,最終輸出結(jié)果。那其實運算過程中的變量數(shù)據(jù)都是存在棧里邊,根據(jù)棧先進后出的特點,完成程序的運行邏輯。而對 Java 這種面向?qū)ο缶幊痰恼Z言,對象的信息就沒放棧里邊,而存到了堆里邊,棧只存對象的引用地址。

另外,有些數(shù)據(jù)要求是不可變的,Java 會分配一塊常量池出來。

比如 String 的場景。

String str1 = "蝸牛666";  String str2 = "蝸牛666";  String newnewStr1 = new String("蝸牛666");  String newnewStr2 = new String("蝸牛666");

str1 和 str2 就存儲在常量池中。而常量池中的數(shù)據(jù)只有一份,因此 str1 和 str2 其實是指向同一塊內(nèi)存空間。

newStr1 和 newStr2 是通過 new 語法創(chuàng)建的對象,在創(chuàng)建的過程中,Java 會先去常量池中查找是否已有 蝸牛666 對象,如果沒有則在常量池中創(chuàng)建一個 蝸牛666 對象,然后在堆中創(chuàng)建一個 蝸牛666 的拷貝對象。

Java字符串的定義和用法

所以 new String("xxx"); 這行代碼會產(chǎn)生幾個對象?

答案是一個或兩個。如果常量池中原來沒有 xxx,就是兩個。如果有就是一個。

字符串的特點

字符串最大的特點就是不可變性。前邊也有提過,字符串在常量池會有一份,常量這個信息就說明字符串具備不可變性了。

我們看下實例,你猜下以下程序會輸出什么:

String strChange = "蝸牛666";  System.out.println(strChange);  strChange = "蝸牛888";  System.out.println(strChange);

都是 蝸牛666?因為字符串不可變嘛

事實上不是:

蝸牛666  蝸牛888

難道 蝸牛666 被改成 蝸牛888 了?

實際上不是,蝸牛666 和 蝸牛888 都在,只是 strChange 的指向變了。

Java字符串的定義和用法

程序在執(zhí)行 String strChange = "蝸牛666"; 時,JVM 虛擬機先在常量池創(chuàng)建字符串 蝸牛666 ,然后把變量 strChange 指向它。

然后在執(zhí)行 strChange = "蝸牛888"; 時,JVM 虛擬機先在常量池創(chuàng)建字符串 蝸牛888 ,然后把變量 strChange指向它。

所以你會發(fā)現(xiàn),剛開始的字符串 蝸牛666 還在,只是變量 strChange 不再指向它了。

因此,字符串的不可變特性,是指字符串內(nèi)容不可變。

另外,字符串的不可變特性,也帶來了兩個好處。

一個是 String 對象可以緩存哈希碼。在 String 類的源碼中,你可以看到這么一個屬性。

/** Cache the hash code for the string */  private int hash; // Default to 0

hash 的值是基于字符串的每個字符計算得出。那字符串的不可變特性,就能保證 hash 的唯一性,因此可以緩存起來,被頻繁使用。這也是性能優(yōu)化的一種手段。

另外一個就是字符串的不可變特性保證了很多場景下的安全。

很多 Java 類庫都會選擇 String 作為參數(shù),像文件路徑 path 這些。如果 String 會經(jīng)常改變,那就有各種安全隱患。

字符串的常用場景

比較

和基本類型相比,字符串也有比較的能力。比如下面的比較方式。

String equalChar = "蝸牛";  String euqalCharCompare = "蝸牛";  System.out.println(equalChar == euqalCharCompare);

直接常量定義的方式,沒有問題,會輸出 true 。但如果通過 new 的方式定義那就容易出錯了,比如以下的代碼,你知道輸出什么么?

String equalMethod = new String("蝸牛");  String euqalMethodCompare = new String("蝸牛");  System.out.println(equalMethod == euqalMethodCompare);

會輸出 false ,而這是不符合我們預(yù)期的。為什么會這樣呢?

因為 == 對于引用類型而言,比較的是引用的地址。而上邊兩個字符串都是 new 出來的新對象。引用地址自然不同。

那如果想只比較內(nèi)容怎么做呢?可以使用 Java String 自帶的 equals 方法!

System.out.println(equalMethod.equals(euqalMethodCompare));

此時就能正常輸出 true 了。

拼接

最簡單的拼接就是用 + 連接符,比如以下代碼。

/**   * 字符串連接   *   * @author 蝸牛   * @from 來源:蝸?;ヂ?lián)網(wǎng)   */  public class StringConnect {       public static void main(String[] args) {          String name = "蝸牛";          String age = "18";          String profile = name + " " + age;          System.out.println(profile);      }  }

運行代碼會輸出:

蝸牛 18

我們可以通過反編譯看下,這段代碼發(fā)生了什么,輸入命令:

javap -c StringConnect

我們看到有如下輸出:

Java字符串的定義和用法

你會發(fā)現(xiàn),加號連接符實際上是 Java 編譯器的優(yōu)化,底層是用了 StringBuilder 這個類,它的 append 方法就起了拼接的效果。

如果拼接的字符串數(shù)量有限,相對固定,建議用加號連接符,這樣一行代碼搞定!

如果拼接的字符串有相關(guān)的邏輯,比如循環(huán)拼接,字符串數(shù)量不太固定,那建議用 StringBuilder 這個工具類。

另外, StringBuilder 是線程不安全的,如果你是多線程開發(fā)環(huán)境,為了保證程序不出錯,可以用它的兄弟類 StringBuffer ,這個類方法和 StringBuilder 一致,只是增加了線程安全的能力。

“Java字符串的定義和用法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI