В Java за удаление неиспользуемых объектов отвечает сборщик мусора (анг. garbage collector). Он автоматически вызывается JVM в определённые моменты времени и удаляет те объекты, которые в данный момент в приложении не используются.
Однако в примере, приведённом вами, сборщик мусора не удалит строку, хоть вы и удалили ссылку на неё и более не используете. Дело в том, что строки в Java, создаваемые посредством кавычек, а не конструкторов, помещаются в так называемый пул строк (анг. string pool), который сборщиком мусора не затрагивается. Когда вы делаете так
s = "Hellow";
вы создаёте строку, которая будет помещена в пул строк. И даже если после этого s
перестанет указывать на неё
s = null;
строка "Hellow" никогда не будет собрана сборщиком мусора, она останется в памяти, то есть, в пуле строк. Поэтому если далее сделать так
String s2 = "Hellow";
System.out.println("Hellow" == s2);
на экран будет выведено true
. Потому что мы не создали новую строку, а указали на имеющуюся в пуле строк.
Однако если создавать строки посредством конструкторов
String s = new String("Hellow");
а затем затирать ссылки на них
s = null;
то в таком случае строки будут удаляться сборщиком мусора, как и любые обыкновенные объекты. И, например, такой код
String s2 = new String("Hellow");
System.out.println(new String("Hellow") == s2);
выведет на экран false
, так как в обоих случаях создаются две независимые друг от друга строки "Hellow", находящиеся в разных местах памяти и при этом не находящиеся в пуле строк. Такие строки при затирании ссылок на них будут удаляться сборщиком мусора.