Java基礎(2)------常量池

常量池分類

  • 靜態常量池:即*.class文件中的常量池,class文件中的常量池不單單包含字符串(數字)字面量,還包含類、方法的信息,佔用class文件絕大部分空間。這種常量池主要用於存放兩大類常量:字面量(例如定義爲final的變量,文本字符等等)符號引用量,符號引用則屬於編譯原理方面的概念,包括了以下三種類型的常量:
  1. 類和接口的全限定名
  2. 字段名稱和描述符
  3. 方法名稱和描述符
  • 運行時常量池: 運行時常量池相對於CLass文件常量池的另一個重要特徵是具有動態性,Java語言並不要求常量必定只有編譯期才能產生,也就是並不是預置入Class文件中常量池的內容才能進入方法區運行時常量池,運行期間也可能將新的常量放入池中。String的intern()方法會查找在常量池中是否存在一份equal相等的字符串,若是有則返回該字符串的引用,若是沒有則添加本身的字符串進入常量池。

String 常量池舉例

  1. 直接使用雙引號聲明出來的 String 對象會直接存儲在常量池中。

  1. 使用new關鍵字建立String的對象不會存儲在常量池中.

  1. 若是不是用雙引號聲明的 String 對象,可使用 String 提供的 intern 方法。String.intern() 是一個 Native 方法,它的做用是:若是運行時常量池中已經包含一個等於此 String 對象內容的字符串,則返回常量池中該字符串的引用;若是沒有,則在常量池中建立與此 String 內容相同的字符串,並返回常量池中建立的字符串的引用。

與intern有關的比較例子:緩存

注意點:性能

  • == 比較的是內存地址 , equals比較的是值
  • 字符串拼接的時候:變量+變量 和 直接用字符串+字符串拼接是不同的,前一種會建立個新的對象。
  1. 咱們在使用字符串的時候應儘可能避免多個字符串拼接,由於這樣會從新建立對象。若是須要改變字符串的話,可使用 StringBuilder 或者 StringBuffer。

其餘常量池

  • Java 基本類型的包裝類的大部分都實現了常量池技術,即 Byte、Short、Integer、Long、Character、Boolean;這5種包裝類默認建立了數值 [-128,127] 的相應類型的緩存數據,可是超出此範圍仍然會去建立新的對象。ui

  • 兩種浮點數類型的包裝類 Float、Double 並無實現常量池技術。3d

使用常量池的好處

避免了頻繁的建立和銷燬對象影響系統的性能,實現了對象的共享,同時也能夠節省存儲空間,相同的對象佔用同一個內存。cdn

相關文章
相關標籤/搜索