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