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