在Java 7或更低版本中,如果使用以下语法
创建StringString s1=new String("abc");
根据this link,每当我们创建一个String对象时,将创建两个对象,即一个在堆区域中,一个在String常量池中,而String对象引用总是指向堆区域对象,如下所示点。
----------------------------------------------
| Heap | String Constant Pool |
|---------------------|-----------------------
| | |
| "abc" | "abc" |
| ^ | |
| | | |
| s1 | |
如果我们创建另一个具有与
相同值的String对象,那么内存表示是什么String s2=new String("abc");
这会在堆中创建另一个具有相同值的对象吗?
或者只是创建将String常量池引用到堆中的对象?
答案 0 :(得分:1)
----------------------------------------------
| Heap | String Constant Pool |
|---------------------|-----------------------
| | |
| "abc" "abc" | "abc" |
| ^ ^ | |
| | | | |
| s1 s2 | |
正如Andy Turner所说,new
运算符总是生成一个新实例。它由JLS保证。
唯一的小问题是在某些情况下(例如,如果在某些JVM版本中启用了转义分析),new
运算符可能会在堆栈而不是堆上分配对象。