摘要:使用構造方法進行類對象實例化,會開辟兩塊堆內存空間,一塊是匿名對象所占,一塊是使用關鍵字創建的堆內存。而且在賦值操作完成后,匿名對象所占的堆內存空間將會變成垃圾空間。
String 類
字符串廣泛應用 在Java 編程中,在 Java 中字符串屬于對象,Java 提供了 String 類來創建和操作字符串。
實例化String類實例化一個String類有兩種方法:
直接賦值String str = "hello world";利用構造方法
示例:
String str = new String("hello world");兩種實例化方式的區別
字符串常量實際上是String的匿名對象。這里"hello world"就是一個String的匿名對象。因此"hello world" 可以直接調用String類的方法和屬性。
因此所謂的直接賦值實際上是給一個匿名對象設置了名字而已,匿名對象由系統自動生成,不再有用戶使用new創建。
使用構造方法進行String類對象實例化,會開辟兩塊堆內存空間,一塊是"hello world"匿名對象所占,一塊是使用new關鍵字創建的堆內存。
而且在賦值操作完成后,"hello world"匿名對象所占的堆內存空間將會變成垃圾空間。
因此直接賦值將會比使用構造方法的方式節省一塊堆內存空間。而且使用構造方法定義的String對象,也不會保存在對象池中。
使用new一定會開辟新的堆內存空間。
如果希望新開辟的String類內存數據保存進對象池,可以使用String類的intern()方法。
因此這兩種實例化的區別總結如下:
直接賦值:只會開辟一塊堆內存空間,并且會自動保存在對象池之中,以供下次再次使用。
構造方法:會開辟兩塊堆內存空間,其中匿名對象所占的空間會成為垃圾空間,并且不會自動入池,但是用戶可以使用intern手工入池。
示例:
public class StringDemo{ public static void main(String args[]) { String stra = "hello"; String strb = "hello"; String strc = "hello"; String strd = new String("hello");//一旦使用new,一定會分配新的堆內存。 String stre = new String("hello").intern();//使用intern手工入池。 System.out.println(stra == strb); System.out.println(stra == strc); System.out.println(strc == strb); System.out.println(stra == strd); System.out.println(stra == stre); } } 輸出結果: true true true false trueString 方法
參考:https://docs.oracle.com/javas...
String “==” 與 “equals()”的區別== 是java提供的關系運算符,主要的功能是判斷數值是否相同,如果用在String對象上,比較的是兩個String對象所指向的堆內存地址是否一樣。
equals()是由String提供的一個方法,判斷兩個String對象的內容是否相同。
示例:
public class StringDemo{ public static void main(String args[]) { String stra = "hello"; String strb = new String("hello"); String strc = strb; System.out.println(stra == strb); System.out.println(stra == strc); System.out.println(strc == strb); System.out.println(stra.equals(strb)); } } 輸出結果: false false true trueString對象內容不可改變
String對象的內容不能改變,而對于String變量內容的變化,是利用了引用關系的變化而實現的。每一次的變化都會使得String變量指向的堆內存空間改變,而且原先的堆內存空間將會變成垃圾空間。
示例:
public class StringDemo{ public static void main(String args[]) { String str = "hello "; //使用identityHashCode獲取根據對象內存地址計算出來的哈希碼,不同的地址算出來的結果是不一樣的。 System.out.println(System.identityHashCode(str)); str = str + "world "; System.out.println(System.identityHashCode(str)); str += "!!!"; System.out.println(System.identityHashCode(str)); System.out.println(str); } } 輸出結果: 366712642 1829164700 2018699554 hello world !!!String類特點總結
String對象有兩種實例化方式,使用直接賦值方式可以不產生垃圾空間,并且可以自動入池。使用構造方法會產生一塊垃圾空間,也不會自動入池。
String對象一旦實例化,其內容不可改變,String類對象內容的改變是依靠引用關系的改變實現的。因此很多時候可以當成基本數據類型來使用。
String對象的內容相等判斷equals()方法完成,“==”實現的是內存地址的判斷。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73498.html
摘要:變量中的類型變量中的類型分為三種靜態變量或者類變量實例變量局部變量靜態變量靜態變量也被稱為類變量,因為它們與類相關聯,并且對于類的所有實例對象都是通用的。局部變量是定義在一個類的函數里面,其作用范圍被限制在該函數內部,外部無法訪問該變量。 1. 理解 Java 中的變量 程序中需要處理數據,Java 中的變量是用來裝載數據。變量類似一個盒子,我們通過這個盒子,就可以操作盒子里面的數據。...
摘要:目錄介紹問題匯總具體問題好消息博客筆記大匯總年月到至今,包括基礎及深入知識點,技術博客,學習筆記等等,還包括平時開發中遇到的匯總,當然也在工作之余收集了大量的面試題,長期更新維護并且修正,持續完善開源的文件是格式的同時也開源了生活博客,從年 目錄介紹 00.Java問題匯總 01.具體問題 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎及深入知識點,Android技...
摘要:無限期等待另一個線程執行特定操作。線程安全基本版請說明以及的區別值都不能為空數組結構上,通過數組和鏈表實現。優先考慮響應中斷,而不是響應鎖的普通獲取或重入獲取。只是在最后獲取鎖成功后再把當前線程置為狀態然后再中斷線程。 前段時間在慕課網直播上聽小馬哥面試勸退(面試虐我千百遍,Java 并發真討厭),發現講得東西比自己拿到offer還要高興,于是自己在線下做了一點小筆記,供各位參考。 課...
摘要:我們的目標是建立對每一種語言的認識,它們是如何進化的,未來將走向何方。有點的味道是堅持使用動態類型,但唯一還收到合理擁泵的編程語言,然而一些在企業的大型團隊中工作的開發者擇認為這會是的一個缺陷。 為什么我們需要如此多的JVM語言? 在2013年你可以有50中JVM語言的選擇來用于你的下一個項目。盡管你可以說出一大打的名字,你會準備為你的下一個項目選擇一種新的JVM語言么? 如今借助來自...
閱讀 2907·2021-11-15 18:02
閱讀 3801·2021-10-14 09:43
閱讀 3733·2021-09-08 10:41
閱讀 2522·2019-08-30 15:53
閱讀 1804·2019-08-30 14:14
閱讀 1943·2019-08-29 16:12
閱讀 3139·2019-08-29 14:03
閱讀 1280·2019-08-29 13:46