淺談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"存進(jìn)去,并且把地址返回給棧內(nèi)存中的str, 此時A對象成為了一個垃圾對象,因?yàn)樗鼪]有被任何棧中的變量指向,會被GC自動回收。
直接賦值。如String str = "Hello"; 首先會去緩沖池中找有沒有一個"Hello"對象,如果沒有,則新建一個,并且入池,所以此種賦值有一個好處,下次如果還有String對象也用直接賦值方式定義為“Hello”, 則不需要開辟新的堆空間,而仍然指向這個池中的"Hello"
解釋
l 字符串的內(nèi)容是存放在方法區(qū)的字符串常量池的,沒有的時候就新建一個,已經(jīng)存在的時候就直接指過去。
l String str1 = “AA”,這種是直接操作字符串常量池指過去;String str2 = new String(“AA”);這種是先在堆空間開辟這個類的對象,實(shí)際上在內(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方法,實(shí)際上比較的是字符串的內(nèi)容是否相等,true System.out.println("str1.equals(str3): " + (str1.equals(str3)) ); Animal p1 = new Animal("AA",10); Animal p2 = new Animal("AA",12); //因?yàn)闃?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)文章
ConcurrentModificationException日志關(guān)鍵字報警思考分析
本文將記錄和分析日志中的ConcurrentModificationException關(guān)鍵字報警,還有一些我的思考,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-12-12Java cglib為實(shí)體類(javabean)動態(tài)添加屬性方式
這篇文章主要介紹了Java cglib為實(shí)體類(javabean)動態(tài)添加屬性方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Matplotlib可視化之自定義顏色繪制精美統(tǒng)計圖
matplotlib提供的所有繪圖都帶有默認(rèn)樣式.雖然這可以進(jìn)行快速繪圖,但有時可能需要自定義繪圖的顏色和樣式,以對繪制更加精美、符合審美要求的圖像.matplotlib的設(shè)計考慮到了此需求靈活性,很容易調(diào)整matplotlib圖形的樣式,需要的朋友可以參考下2021-06-06kotlin快速入門之標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法
學(xué)完了Kotlin的基礎(chǔ)知識,是時候來來學(xué)習(xí) Kotlin的標(biāo)準(zhǔn)函數(shù)和靜態(tài)方法了,下面這篇文章主要給大家介紹了關(guān)于kotlin快速入門之標(biāo)準(zhǔn)函數(shù)與靜態(tài)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09SpringMVC高級開發(fā)功能實(shí)現(xiàn)過程解析
這篇文章主要介紹了SpringMVC高級開發(fā)功能實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06Java設(shè)計模式之責(zé)任鏈模式(Chain of Responsibility模式)介紹
這篇文章主要介紹了Java設(shè)計模式之責(zé)任鏈模式(Chain of Responsibility模式)介紹,本文講解了如何使用責(zé)任鏈模式,并給出了4種使用實(shí)例,需要的朋友可以參考下2015-03-03SpringBoot項(xiàng)目打包為JAR文件的實(shí)現(xiàn)
本文主要介紹了SpringBoot項(xiàng)目打包為JAR文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09