溫馨提示×

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

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

String有哪些作用

發(fā)布時(shí)間:2021-06-23 12:01:56 來(lái)源:億速云 閱讀:493 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“String有哪些作用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“String有哪些作用”吧!

在 Java 中,我們有兩種方式創(chuàng)建一個(gè)字符串

String x = "abc";
String y = new String("abc");

你常見(jiàn)也常寫第一種,很少見(jiàn)第二種,但面試還總問(wèn)這類問(wèn)題,雙引號(hào)和構(gòu)造器兩種形式創(chuàng)建字符串到底有什么差別呢?

先來(lái)看例子

例子 1

String a = "abcd";
String b = "abcd";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

a == b 結(jié)果為 true,是因?yàn)?a 和 b 都指向 方法區(qū)(method area) 同一個(gè)字符串文字,內(nèi)存引用是同一個(gè)

當(dāng)多次創(chuàng)建相同的字符串文字時(shí),只存儲(chǔ)每個(gè)不同字符串值的一個(gè)副本。這個(gè)叫做字符串留駐/留用,Java 中所有編譯期字符串常量都會(huì)被自動(dòng)留駐

例子 2

String c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d);  // False
System.out.println(c.equals(d)); // True

c==d 結(jié)果為 false,因?yàn)?c 和 d 的引用指向中不同的對(duì)象,不同的對(duì)象肯定有不同的內(nèi)存引用

舉了兩個(gè)例子,文字描述有點(diǎn)懵?我們來(lái)試圖通過(guò)圖形來(lái)理解上述兩種情況:

String有哪些作用

也許你已經(jīng)看看出來(lái)了,一個(gè)是在方法區(qū),一個(gè)是在中,在 JVM 模型中這是兩個(gè)不同的區(qū)域,也許你面試時(shí)也經(jīng)常被問(wèn)到吧,來(lái)看下圖:

String有哪些作用

再次提醒一下,所有 new 的對(duì)象都會(huì)在 Heap 中,這樣以后你就好區(qū)分了

運(yùn)行期字符串留駐

上面說(shuō)的字符串留駐是在編譯期,那么運(yùn)行期可以嗎?答案是肯定的,我們需要一個(gè)函數(shù)來(lái)幫忙

String c = new String("abcd").intern();
String d = new String("abcd").intern();
System.out.println(c == d);  // Now true
System.out.println(c.equals(d)); // True

看到 c == d 結(jié)果為 true,你應(yīng)該理解 intern (英文有拘留,軟禁的意思)的作用了,通過(guò)調(diào)用 intern()方法,就好比把創(chuàng)建的字符串拘留在方法區(qū)一樣了

在面試時(shí)甚至還會(huì)問(wèn)你下面代碼創(chuàng)建了幾個(gè)對(duì)象:

String d = new String("abcd")
  1. 如果方法區(qū)已存在"abcd", 那么只創(chuàng)建一個(gè) new String 的對(duì)象

  2. 如果方法區(qū)沒(méi)有"abcd", 那么要?jiǎng)?chuàng)建兩個(gè)對(duì)象,一個(gè)在方法區(qū),一個(gè)在堆中

所以,正常情況下我們沒(méi)必要使用構(gòu)造器創(chuàng)建對(duì)象,因?yàn)檫@很可能會(huì)產(chǎn)生一個(gè)額外的沒(méi)用的對(duì)象,但是有例外哦,我們下面說(shuō)

String s = "abcd";
s = s.concat("ef");

String有哪些作用

當(dāng)我們想在字符串 s 后面拼接字符"ef"時(shí),會(huì)在堆中創(chuàng)建一個(gè)新的對(duì)象,并將 s 的引用指向新創(chuàng)建的對(duì)象,由于 String 創(chuàng)建的是不可變對(duì)象,所以 String 類中的所有方法都不會(huì)改變它自身,而是返回一個(gè)新的字符串(快打開(kāi)你的 IDE,看看是否每個(gè)操作String 的方法最后都是返回有 return new String 字樣),到這里你也應(yīng)該理解了一個(gè)道理:

如果我們需要一個(gè)字符串被修改,我們最好使用 StringBuffer 或者 StringBuilder,否則,由于每次操作字符串都會(huì)創(chuàng)建一個(gè)新的對(duì)象,而舊的對(duì)象不會(huì)有引用指向它,這樣我們會(huì)浪費(fèi)很多垃圾回收的時(shí)間

到這里還沒(méi)完,你有沒(méi)有想過(guò)為什么 String 會(huì)被設(shè)置/制造成 final?

為什么 String 類被 final 修飾

談及這個(gè)問(wèn)題我們需要一些倒推的或者相互約束思維來(lái)思考

字符串池的需求

字符串池(String intern pool)是方法區(qū)域中的一個(gè)特殊存儲(chǔ)區(qū)域。當(dāng)創(chuàng)建一個(gè)字符串時(shí),如果該字符串已經(jīng)存在于池中,那么返回現(xiàn)有字符串的引用,而不是創(chuàng)建一個(gè)新對(duì)象。所以說(shuō),如果一個(gè)字符串是可變的,那么改變一個(gè)引用的值,將導(dǎo)致原本指向該值的引用獲取到錯(cuò)誤的值

緩存 hashcode

字符串的hashcode在Java中經(jīng)常使用。例如,在HashMap或HashSet中。不可變保證hashcode始終是相同的,這樣就可以在不擔(dān)心更改的情況下兌現(xiàn)它。這意味著,不需要每次使用hashcode時(shí)都計(jì)算它。這樣更有效率。所以你會(huì)在 String 類中看到下面的成員變量的定義:

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

安全性

String被廣泛用作許多java類的參數(shù),例如網(wǎng)絡(luò)連接、打開(kāi)文件等。如果字符串不是不可變的,連接或文件將被更改,這可能導(dǎo)致嚴(yán)重的安全威脅。該方法認(rèn)為它連接到一臺(tái)機(jī)器上,但實(shí)際上并沒(méi)有。可變字符串也可能導(dǎo)致反射中的安全問(wèn)題,因?yàn)閰?shù)是字符串

不可變對(duì)象天生是線程安全的

由于不可變對(duì)象不能被更改,所以它們可以在多個(gè)線程之間自由共享。這消除了同步的需求。

總之,出于效率和安全性的考慮,String 被設(shè)計(jì)為不可變的。這也是為什么在一般情況下,不可變類是首選的原因。

附加說(shuō)明

關(guān)于不可變對(duì)象和不可變引用總是有同學(xué)搞不清楚

final User user = new User();

上面的代碼指的是 user 引用不能被更改指向內(nèi)存的其他地址,但是由于 User 是可變對(duì)象,我們可以調(diào)用 user 的 setter 方法修改其屬性

在String類中包含很多學(xué)問(wèn),包括你對(duì)JVM模型的理解,這也就是為什么面試官為什么喜歡問(wèn)String,主要考察你的基本功

靈魂追問(wèn)

  1. String 和基本類型的包裝類如 Integer 和 Long 都被 final 修飾,但為什么不建議作為 synchronized 同步塊的參數(shù)適用呢?

  2. 基本類型自動(dòng)裝箱你知道發(fā)生了什么嗎?和上一個(gè)問(wèn)題有關(guān)系

提高效率工具

String有哪些作用

Material Theme UI

這是一款 IDEA 的主題插件,安裝后,選擇 Material Palenight 主題,同時(shí)作出如下設(shè)置 String有哪些作用

設(shè)置完后,你的 IDEA 就是下面這樣,引起極度舒適 String有哪些作用

感謝各位的閱讀,以上就是“String有哪些作用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)String有哪些作用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

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

AI