對于常量池而言,字符串的概念較為廣泛,并不單指字符串變量。類名、方法名、類型、this指針名,等等,都可以看作是字符串,最終都會被JVM當作字符串處理、存儲到符號區。
由于無論是tag還是constantPool的數據區,一個存儲位置只能存放一個指針寬度的數據,而字符串往往很大,因此JVM專門設計一個“符合表”的內存區,tag和constantPool數據區內僅保存指針指向符號區。
JVM對字符串的處理如下:
以上代碼給出了一個基本思路,即字節碼文件中的字符串常量池元素最終都會被保存到符號表中,為了節省內存,JVM會先判斷符號表中是否存在相同的字符串,如果已經存在,則不會申請內存。這就是如果你在一個類中定義了兩個字符串,但是這兩個字符串的值相同,最終這兩個字符串變量都會同時指向常量池中同一個位置的原因。