1. 程式人生 > >字符串常量池

字符串常量池

語言 內容 等於 string對象 equals permanent main blog args

引言

Java語言不要求常量一定要在編譯期才能產生,也就是並非預置入Class文件中常量池的內容才能進入方法區的運行時常量池,程序運行期間也可以將常量放入池中。

設計字符串常量池的原因

字符串在java程序中被大量使用,為了避免每次都創建相同的字符串對象及內存分配,JVM內部對字符串對象的創建做了一定的優化,在Permanent Generation中專門有一塊區域用來存儲字符串常量池(一組指針指向Heap中的String對象的內存地址)。

字符串所在的內存區域

兩種內存區域:常量池、堆

String str1 = "helloworld"; //存在於常量池中
String str2 = new
String("helloworld"); // ‘helloworld‘存在於常量池中,String對象存在於堆中 String str3 = str1 + "world"; // 有字符串引用時,在堆中建立一個String對象將引用返回

String中intern的方法

當調用 intern 方法時,如果池已經包含一個等於此String對象的字符串(該對象由 equals(Object) 方法確定),則返回池中的字符串。否則,將此String對象添加到池中,並且返回此 String對象的引用。

public static void main(String[] args) {
        String str1 
= "a"; String str2 = "b"; String str3 = "ab"; String str4 = str1 + str2; String str5 = new String("ab"); System.out.println(str5 == str3); System.out.println(str5.intern() == str3); System.out.println(str5.intern() == str4); }

結果:false, true, false

解析原因:1、一個存在於常量池中,一個存在於堆中對象地址不同返回false

     2、str5執行intern方法去常量池中判斷有沒有和‘‘ab‘‘字符串equals的字符串,一看有就是str3返回str3的引用,此時再==時返回true

     3、str5執行intern方法去常量池中判斷有沒有和‘‘ab‘‘字符串equals的字符串,一看有就是str3返回str3的引用,此時判斷str3和str4是否==,我們知道str3存在於常量池,str4存在於堆中地址不同返回false

str1,str2,str3在JVM編譯期就已經存在了位於字符串常量池中,而str4和str5是在程序運行期才存在的位於堆中

字符串常量池