2014-12-01 6 views

ответ

0

Прежде всего, вы должны спросить себя, сколько объектов создано. В вашем фрагменте кода создаются три объекта String. Поскольку вы создали их с помощью «", они являются частью пула строк. Однако после запуска вашего кода все эти три объекта будут выбраны ELIGBLE сборщиком мусора. Обратите внимание, что это не гарантирует, что они действительно собраны.

0

Heap and Stringpool

strMsg не в Heap, это будет в Stringpool. Поэтому вы не знаете, когда он будет собран.

При создании строки, как

String input = new string("Hai"); 

Вы используете новый оператор для создания объекта. Когда вы создаете new String() с новым оператором, он будет создан в памяти кучи.

При использовании унаследованного кода, как

String input = "Hai"; 

Он не будет создавать в памяти кучи. Он будет создан в Stringpool.

Garbage Collection:

If the String will not have any reference, then it will be collected. 

Почему они собираются?

Because of memory optimization. Unwanted memory occupation will be releaved by using Garbage Collection, upto your program will stops. 

Если создать две строки, имеющие такое же значение, как

String s = "Sample"; 
    String s1 = "Sample"; 

Оба s and s1 будут указывать ту же ссылку. Поскольку Stringpool похож на константы, он проверяет каждый раз, когда предстоящее значение может существовать или нет. Если он доступен, он берет старый адрес и назначает новую переменную. Если вы измените значение переменной, оно создаст новую String в Stringpool.

0

Редактировать: Похоже, что мое объяснение о строках является точной, только если вы создаете строку, используя конструктор String (например, String str = new String("cat");). Есть несколько небольших проблем, которые мои объяснения не касаются строк. Для получения более общей информации о строках ознакомьтесь с ответом @newuser. Мое объяснение должно работать для большинства объектов Java.

В Java переменные являются фактически ссылками на другие объекты. (В других языках ссылки называются «указателями».) Например, если переменная s создана String s = "hello", s фактически не содержит «привет». s содержит ссылку на привет. Различие тонкое, но важное. Это означает, что если позже в вашем коде вы делаете s = "bye", переменная s теперь указывает на «bye», а не «hello». Тем не менее, строковый объект «hello» по-прежнему плавает в памяти где-то, но у вас нет ссылок на него. Итак, теперь вы не можете получить доступ к объекту «hello». Сборщик мусора реализует это и удаляет объект «привет» для сохранения памяти. Итак, в вашем примере «PM», «AM» собраны мусор, так как ссылки на эти объекты отсутствуют (переменные не указывают на эти объекты).

Вот более графическое представление того, что я пытаюсь объяснить:

String strMsg = "PM"; 

strMsg ------> "PM" 

strMsg = "AM"; 

strMsg  "PM" 
    | 
    --------> "AM" 

strMsg = "MN"; 

strMsg   "PM" 
    | 
    |   "AM" 
    | 
    ---------> "MN" 

Как выясняется, примитивные типы (например, int, float, double, char и т. д.) фактически хранятся в переменной. Это означает, что если вы делаете float x = 10.3, переменная x фактически содержит 10.3. Поэтому, если вы позже сделаете x = 8.9, переменная x фактически была изменена с 10.3 до 8.9. Это отличается от изменения ссылки, которая изменяется там, где указывает переменная. Поэтому в случае примитивных типов нет необходимости в сборке мусора. В вашем примере ни один из значений с плавающей запятой, установленный в price, не собран.

float price = 7.50f; 

price | 7.50f | 

price = 8.50f; 

price | 8.50f | 

price = 9.50f; 

price | 9.50f | 
+0

В целом хорошо, но неправильно при работе со строковыми константами, которые будут находиться вокруг до тех пор, пока сам класс не будет собран из мусора (обычно никогда). – chrylis

+0

Не стесняйтесь редактировать мой ответ, чтобы включить это. На самом деле я почти ничего не знаю о всей строке, но я попытался объяснить общий смысл объектов. – user2649759

Смежные вопросы