常量池分類
- 靜態常量池:即*.class文件中的常量池,class文件中的常量池不單單包含字符串(數字)字面量,還包含類、方法的信息,佔用class文件絕大部分空間。這種常量池主要用於存放兩大類常量:字面量(例如定義爲final的變量,文本字符等等)、符號引用量,符號引用則屬於編譯原理方面的概念,包括了以下三種類型的常量:
- 類和接口的全限定名
- 字段名稱和描述符
- 方法名稱和描述符
- 運行時常量池: 運行時常量池相對於CLass文件常量池的另一個重要特徵是具有動態性,Java語言並不要求常量必定只有編譯期才能產生,也就是並不是預置入Class文件中常量池的內容才能進入方法區運行時常量池,運行期間也可能將新的常量放入池中。String的intern()方法會查找在常量池中是否存在一份equal相等的字符串,若是有則返回該字符串的引用,若是沒有則添加本身的字符串進入常量池。
String 常量池舉例
- 直接使用雙引號聲明出來的 String 對象會直接存儲在常量池中。
- 使用new關鍵字建立String的對象不會存儲在常量池中.
- 若是不是用雙引號聲明的 String 對象,可使用 String 提供的 intern 方法。String.intern() 是一個 Native 方法,它的做用是:若是運行時常量池中已經包含一個等於此 String 對象內容的字符串,則返回常量池中該字符串的引用;若是沒有,則在常量池中建立與此 String 內容相同的字符串,並返回常量池中建立的字符串的引用。
與intern有關的比較例子:緩存
注意點:性能
- == 比較的是內存地址 , equals比較的是值
- 字符串拼接的時候:變量+變量 和 直接用字符串+字符串拼接是不同的,前一種會建立個新的對象。
- 咱們在使用字符串的時候應儘可能避免多個字符串拼接,由於這樣會從新建立對象。若是須要改變字符串的話,可使用 StringBuilder 或者 StringBuffer。
其餘常量池
使用常量池的好處
避免了頻繁的建立和銷燬對象影響系統的性能,實現了對象的共享,同時也能夠節省存儲空間,相同的對象佔用同一個內存。cdn