午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java 字符串是不可變的。到底是什么意思?

瀏覽:236日期:2024-04-14 13:32:58
如何解決Java 字符串是不可變的。到底是什么意思??

在進(jìn)一步探討不變性之前,讓我們String在得出任何結(jié)論之前先了解一下類(lèi)及其功能。

這是如何String工作的:

String str = 'kNowledge';

與往常一樣,這將創(chuàng)建一個(gè)包含的字符串”kNowledge”并為其指定一個(gè)reference str。很簡(jiǎn)單?讓我們執(zhí)行更多功能:

String s = str; // assigns a new reference to the same string 'kNowledge'

讓我們看看下面的語(yǔ)句是如何工作的:

str = str.concat(' base');

這會(huì)將一個(gè)字符串附加' base'到str。但是,等等,由于String對(duì)象是不可變的,這怎么可能呢?令你驚訝的是。

當(dāng)執(zhí)行以上語(yǔ)句時(shí),VM接受的值String str,即'kNowledge'和' base',為我們提供值'kNowledge base'。現(xiàn)在,由于Strings是不可變的,因此VM無(wú)法將此值分配給str,因此它創(chuàng)建了一個(gè)新String對(duì)象,為其提供了一個(gè)值'kNowledge base',并為其提供了一個(gè)引用str。

這里要注意的重要一點(diǎn)是,盡管String對(duì)象是不可變的,但其引用變量卻不是。這就是為什么在上面的示例中,引用是指新形成的String對(duì)象。

至此,在上面的示例中,我們有兩個(gè)String對(duì)象:第一個(gè)對(duì)象是我們用value創(chuàng)建的,'kNowledge'由指向s,第二個(gè)對(duì)象是'kNowledge base'由指向str。但是,從技術(shù)上講,我們有三個(gè)String對(duì)象,第三個(gè)對(duì)象'base'是concat語(yǔ)句中的文字。

有關(guān)字符串和內(nèi)存使用情況的重要事實(shí)如果沒(méi)有其他參考s該”kNowledge”怎么辦?我們會(huì)失去那個(gè)String。但是,它仍然存在,但由于沒(méi)有參考文獻(xiàn)而被認(rèn)為丟失。再看下面的一個(gè)例子

String s1 = 'java';s1.concat(' rules');System.out.println('s1 refers to '+s1); // Yes, s1 still refers to 'java'

發(fā)生了什么:

第一行非常簡(jiǎn)單:創(chuàng)建一個(gè)新的String 'java'并引用s1它。接下來(lái),VM創(chuàng)建另一個(gè)new String 'java rules',但沒(méi)有任何引用。因此,第二個(gè)String瞬間丟失。我們無(wú)法達(dá)到。參考變量s1仍然引用原始變量String 'java'。

應(yīng)用于String對(duì)象以對(duì)其進(jìn)行修改的幾乎每種方法都會(huì)創(chuàng)建新String對(duì)象。那么,這些String物體在哪里呢?嗯,這些存在于內(nèi)存中,任何編程語(yǔ)言的主要目標(biāo)之一就是有效利用內(nèi)存。

隨著應(yīng)用程序的增長(zhǎng),文字通常String會(huì)占用很大的內(nèi)存區(qū)域,這甚至可能導(dǎo)致冗余。因此,為了提高Java的效率,JVM預(yù)留了一個(gè)特殊的內(nèi)存區(qū)域,稱(chēng)為“字符串常量池”。

當(dāng)編譯器看到String文字時(shí),它將String在池中查找。如果找到匹配項(xiàng),則對(duì)新文字的引用將指向現(xiàn)有文件,String并且不會(huì)String創(chuàng)建新對(duì)象。現(xiàn)有的String只是另外一個(gè)參考。這是使String對(duì)象不可變的要點(diǎn):

在String常量池中,一個(gè)String對(duì)象可能具有一個(gè)或多個(gè)引用。如果幾個(gè)引用指向同一對(duì)象String甚至不知道它,那么如果其中一個(gè)引用修改了該String值,那將是不好的。這就是為什么String對(duì)象是不可變的。

好吧,現(xiàn)在你可以說(shuō),如果有人重寫(xiě)了String類(lèi)的功能怎么辦?就是這樣的原因的String類(lèi)被標(biāo)記final,這樣沒(méi)有人可以凌駕于其方法的行為。

解決方法

我在不可變字符串上編寫(xiě)了以下代碼。

public class ImmutableStrings { public static void main(String[] args) {testmethod(); } private static void testmethod() {String a = "a";System.out.println("a 1-->" + a);a = "ty";System.out.println("a 2-->" + a); }}

輸出:

a 1-->a a 2-->ty

此處變量的值a已更改(許多人說(shuō)不能更改不可變對(duì)象的內(nèi)容)。但是,一句話到底是什么String是不變的呢?

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 在线91观看 | 可以免费在线观看的av | 欧美日韩中文字幕在线观看 | 91日韩欧美 | 色猫咪av | 国产片91 | 久久精品偷拍视频 | 国产成人a∨ | 在线观看免费国产 | 91免费大全| 欧美xx孕妇 | 最新久久久 | 午夜国产福利 | 69av视频在线观看 | 可以在线观看av的网站 | 天天舔天天干天天操 | 亚洲免费a | 国产精品第 | 欧美又大又粗又长 | 日本久久精品 | www狠狠操| 久久99精品久久久久久园产越南 | 国产精品久久国产精品 | 亚洲天堂一区 | 国产精品美女久久久久久久久 | 久久国产精品影院 | 日韩在线一区二区 | 久久久69| 怡春院欧美 | 国产永久在线 | 国产欧美在线 | 亚洲国产精品99久久久久久久久 | 亚洲视频在线免费 | 黄网页在线观看 | 97色在线| 欧美你懂的 | 亚洲福利片 | 精品国产成人 | 亚洲男女天堂 | 日韩欧美一区二区三区在线观看 | 欧美激情一区在线 |