淺談java中String的兩種賦值方式的區(qū)別
類似普通對象,通過new創(chuàng)建字符串對象。String str = new String("Hello"); 內(nèi)存圖如下圖所示,系統(tǒng)會先創(chuàng)建一個匿名對象"Hello"存入堆內(nèi)存(我們暫且叫它A),然后new關(guān)鍵字會在堆內(nèi)存中又開辟一塊新的空間,然后把"Hello"存進去,并且把地址返回給棧內(nèi)存中的str, 此時A對象成為了一個垃圾對象,因為它沒有被任何棧中的變量指向,會被GC自動回收。
直接賦值。如String str = "Hello"; 首先會去緩沖池中找有沒有一個"Hello"對象,如果沒有,則新建一個,并且入池,所以此種賦值有一個好處,下次如果還有String對象也用直接賦值方式定義為“Hello”, 則不需要開辟新的堆空間,而仍然指向這個池中的"Hello"

解釋
l 字符串的內(nèi)容是存放在方法區(qū)的字符串常量池的,沒有的時候就新建一個,已經(jīng)存在的時候就直接指過去。
l String str1 = “AA”,這種是直接操作字符串常量池指過去;String str2 = new String(“AA”);這種是先在堆空間開辟這個類的對象,實際上在內(nèi)部還是指到了字符串常量池;
package two.string.mushroom;
public class TestTwoString
{
public static void main(String[] args)
{
String str1 = "AA";
String str2 = "AA";
String str3 = new String("AA");
System.out.println("str1 == str2: " + (str1 == str2));
//它們都指向字符串常量池中的 "AA",true
System.out.println("str1 == str3: " + (str1 == str3));
//它們本身指向不同,false
//String類重寫了equals方法,實際上比較的是字符串的內(nèi)容是否相等,true
System.out.println("str1.equals(str3): " + (str1.equals(str3)) );
Animal p1 = new Animal("AA",10);
Animal p2 = new Animal("AA",12);
//因為構(gòu)造器中的方式是直接指向字符串常量池的,所以也是true
System.out.println("p1.name == p2.name: " + (p1.name == p2.name));
}
}
class Animal
{
String name;
int age;
Animal(String name,int age)
{
this.name = name;
//構(gòu)造器中的方式是直接指向字符串常量池的
this.age = age;
}
}
測試結(jié)果
str1 == str2: true str1 == str3: false str1.equals(str3): true p1.name == p2.name: true

總結(jié)
以上就是本文關(guān)于淺談java中String的兩種賦值方式的區(qū)別的全部內(nèi)容,希望對大家有所幫助。
相關(guān)文章
Java利用openoffice將doc、docx轉(zhuǎn)為pdf實例代碼
這篇文章主要介紹了Java利用openoffice將doc、docx轉(zhuǎn)為pdf實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
關(guān)于Synchronized和ReentranLock的區(qū)別及說明
文章介紹了Java中的`synchronized`關(guān)鍵字和`ReentrantLock`類,兩者都可以用于解決多線程同步問題,但`ReentrantLock`提供了更多的功能和靈活性2024-12-12
IDEA 程序包不存在,找不到符號但是明明存在對應的jar包(問題分析及解決方案)
這篇文章主要介紹了IDEA 程序包不存在,找不到符號但是明明存在對應的jar包 的解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08

