堆对象的字符串常量池内存表示形式

时间:2018-04-30 12:06:31

标签: java string heap pool

在Java 7或更低版​​本中,如果使用以下语法

创建String
String s1=new String("abc");

根据this link,每当我们创建一个String对象时,将创建两个对象,即一个在堆区域中,一个在String常量池中,而String对象引用总是指向堆区域对象,如下所示点。

----------------------------------------------
|        Heap         | String Constant Pool |
|---------------------|-----------------------                      
|                     |                      |
|      "abc"          |       "abc"          |
|        ^            |                      |
|        |            |                      |
|       s1            |                      |

如果我们创建另一个具有与

相同值的String对象,那么内存表示是什么
String s2=new String("abc");

这会在堆中创建另一个具有相同值的对象吗?
或者只是创建将String常量池引用到堆中的对象?

1 个答案:

答案 0 :(得分:1)

----------------------------------------------
|        Heap         | String Constant Pool |
|---------------------|-----------------------                      
|                     |                      |
|    "abc"  "abc"     |       "abc"          |
|      ^      ^       |                      |
|      |      |       |                      |
|     s1     s2       |                      |

正如Andy Turner所说,new运算符总是生成一个新实例。它由JLS保证。

唯一的小问题是在某些情况下(例如,如果在某些JVM版本中启用了转义分析),new运算符可能会在堆栈而不是堆上分配对象。