Представление памяти пула Heap vs String Constant для объекта - PullRequest
0 голосов
/ 30 апреля 2018

В Java 7 или ниже, если строка создается с использованием синтаксиса ниже

String s1=new String("abc");

Согласно этой ссылке . При создании объекта String создаются два объекта: один в области кучи и один в пуле констант String, а ссылка на объект String всегда указывает на объект области кучи. как показано ниже.

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

Каким будет представление памяти, если мы создадим другой объект String с тем же значением, что и

String s2=new String("abc");

И это создаст другой объект с таким же значением в куче?
или он просто создаст объект, ссылающийся на пул констант String, в кучу?

1 Ответ

0 голосов
/ 30 апреля 2018
----------------------------------------------
|        Heap         | String Constant Pool |
|---------------------|-----------------------                      
|                     |                      |
|    "abc"  "abc"     |       "abc"          |
|      ^      ^       |                      |
|      |      |       |                      |
|     s1     s2       |                      |

Как сказал Энди Тернер, оператор new всегда создает новый экземпляр. Это гарантируется JLS.

Единственная небольшая проблема заключается в том, что при определенных обстоятельствах (например, если в некоторых версиях JVM включен escape-анализ) оператор new может размещать объект в стеке, а не в куче.

...