更新時(shí)間:2022-11-24 10:42:34 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1696次
當(dāng)您在 Java 中聲明一個(gè)新字符串時(shí),幕后會(huì)發(fā)生一些有趣的事情。這是一個(gè)基本的字符串聲明。我們創(chuàng)建一個(gè)名為employee的新字符串變量并為其賦值,如您在代碼中所見(jiàn):
String employee = "Edgar Allen Poe" ;
Java 不僅會(huì)創(chuàng)建變量employee,還會(huì)在內(nèi)存中為文字值“Edgar Allen Poe”分配空間。內(nèi)存中的這個(gè)區(qū)域稱(chēng)為字符串常量池。它就像一個(gè)可供程序其他部分使用的字符串值池。
現(xiàn)在,如果您創(chuàng)建了另一個(gè)變量,比如employee2,并且還給它賦值“Edgar Allen Poe”,Java 將簡(jiǎn)單地重新使用池中已有的值。
您會(huì)注意到字符串常量池位于一段稱(chēng)為堆的內(nèi)存中。這是內(nèi)存的一部分,用于運(yùn)行時(shí)操作,處理類(lèi)和對(duì)象。把一堆想象成一塊花園土壤,當(dāng)你種植花園時(shí),你可以很容易地從中取出泥土和植物。Java 將這些新對(duì)象放在那里。如果你再創(chuàng)建一百個(gè)對(duì)象,Java 將在堆頂上再創(chuàng)建一百個(gè)文字。
1. 直接使用雙引號(hào)聲明出來(lái)的String對(duì)象
String employee3 = new String ( "Edgar Allen Poe" );
創(chuàng)建過(guò)程:JVM會(huì)使用常量池來(lái)管理字符串直接量。在執(zhí)行這句話(huà)時(shí),JVM會(huì)先檢查常量池中是否已經(jīng)存有"abc",若沒(méi)有則將"abc"存入常量池,否則就復(fù)用常量池中已有的"abc",將其引用賦值給變量a。
2. 使用new方法創(chuàng)建出來(lái)的String對(duì)象
可以使用String提供的intern方法。
String s2 = new String("abc");
在執(zhí)行這句話(huà)時(shí),JVM會(huì)先使用常量池來(lái)管理字符串直接量,String 先使用 intern 方法會(huì)從字符串常量池中查詢(xún)當(dāng)前字符串是否存在,若不存在就會(huì)將當(dāng)前字符串放入常量池中,即將"abc"存入常量池。然后再創(chuàng)建一個(gè)新
的String對(duì)象,這個(gè)對(duì)象會(huì)被保存在堆內(nèi)存中。并且,堆中對(duì)象的數(shù)據(jù)會(huì)指向常量池中的直接量。
例如下面代碼進(jìn)行對(duì)abc常量進(jìn)行檢測(cè)是否存在的測(cè)試:
String s1="abc";
String s2 = new String("abc");
System.out.println(s2.intern());
運(yùn)行如下代碼:
public class Test{
public class void main(String[] args){
String s1 = "abc";
String s2 = "abc";
System.out.println("s1="+s1);//abc
System.out.println(s1 == s2);//true
System.out.println("=================");
char[] charArray = {'a','b','c'};
String s3 = new String(charArray);
System.out.println("s3="+s3);//abc
System.out.println(s1 == s3);//false
System.out.println("=================");
String s4 = new String("abc");
System.out.println("s4="+s4);//abc
System.out.println(s1==s4);
System.out.println("=================");
? }
}
運(yùn)行結(jié)果如下:
雖然兩個(gè)輸出兩個(gè)字符串的結(jié)果相同,都為abc,但比較兩者時(shí)則不同,這是因?yàn)楸容^的規(guī)則為:
引用類(lèi)型比較時(shí),比較的是其地址值;
基本數(shù)據(jù)類(lèi)型比較的是其數(shù)據(jù)值。
采用直接創(chuàng)建String類(lèi)型對(duì)象的方法創(chuàng)建對(duì)象時(shí),JVM首先會(huì)去字符串常量池中查找是否存在"abc" 這個(gè)對(duì)象,如果不存在,則在字符串常量池中創(chuàng)建”abc“這個(gè)對(duì)象,然后將池中”abc“對(duì)象的引用地址返回給對(duì)象s1,這樣s1的地址就在常量池中;
如果存在,則不創(chuàng)建任何對(duì)象,直接將存在的“abc”的地址返回給對(duì)象s2。這就是為什么s1等于s2的原因。
而通過(guò)new方法創(chuàng)建的String對(duì)象,其創(chuàng)建的字符串是放在堆當(dāng)中的,將堆當(dāng)中的字符串地址返回賦值給s3,s1和s3的存放地址不相同,一個(gè)在字符串常量池中,一個(gè)在堆當(dāng)中,字符串常量池外,因此返回的值是false。s4同樣如此。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743