Java中String類(lèi)通過(guò)new創(chuàng)建和直接賦值字符串的區(qū)別
方式一:String a = “aaa” ;
方式二:String b = new String(“aaa”);
兩種方式都能創(chuàng)建字符串對(duì)象,但方式一要比方式二更優(yōu)。
因?yàn)樽址潜4嬖?span style="line-height: 1.5; color: rgb(255, 0, 0);">常量池中的,而通過(guò)new創(chuàng)建的對(duì)象會(huì)存放在堆內(nèi)存中。
常量池中已經(jīng)有字符串常量”aaa”
通過(guò)方式一創(chuàng)建對(duì)象,程序運(yùn)行時(shí)會(huì)在常量池中查找”aaa”字符串,將找到的”aaa”字符串的地址賦給a。
通過(guò)方式二創(chuàng)建對(duì)象,無(wú)論常量池中有沒(méi)有”aaa”字符串,程序都會(huì)在堆內(nèi)存中開(kāi)辟一片新空間存放新對(duì)象。
常量池中沒(méi)有字符串常量”aaa”
通過(guò)方式一創(chuàng)建對(duì)象,程序運(yùn)行時(shí)會(huì)將”aaa”字符串放進(jìn)常量池,再將其地址賦給a。
通過(guò)方式二創(chuàng)建對(duì)象,程序會(huì)在堆內(nèi)存中開(kāi)辟一片新空間存放新對(duì)象,同時(shí)會(huì)將”aaa”字符串放入常量池,相當(dāng)于創(chuàng)建了兩個(gè)對(duì)象。
注:常量池:常量池(constant pool)指的是在編譯期被確定,并被保存在已編譯的.class文件中的一些數(shù)據(jù)。它包括了關(guān)于類(lèi)、方法、接口等中的常量,也包括字符串常量。
1.寄存器:最快的存儲(chǔ)區(qū), 由編譯器根據(jù)需求進(jìn)行分配,我們?cè)诔绦蛑袩o(wú)法控制.
2. 棧:存放基本類(lèi)型的變量數(shù)據(jù)和對(duì)象的引用,但對(duì)象本身不存放在棧中,而是存放在堆(new 出來(lái)的對(duì)象)或者常量池中(字符串常量對(duì)象存放在常量池中。)
3. 堆:存放所有new出來(lái)的對(duì)象。
4. 靜態(tài)域:存放靜態(tài)成員(static定義的)
5. 常量池:存放字符串常量和基本類(lèi)型常量(public static final)。
6. 非RAM存儲(chǔ):硬盤(pán)等永久存儲(chǔ)空間