Мне было любопытно, почему строки могут быть созданы без вызова new String()
, поскольку API упоминает, что это Object
из class
java.lang.String
Итак, как мы можем использовать String s="hi"
, а не String s=new String("hi")
?
Этот пост разъяснил использование оператора ==
и отсутствие new
и говорит, что это связано с String
литералами, которые интернированы или взяты из литерала пул JVM
, следовательно Strings
являются неизменяемыми.
При просмотре выражения типа
String s="hi"
в первый раз, что действительно происходит?
-
Является ли
JVM
заменять его так:String s=new String("hi")
, в котором создается объект и добавляется"hi"
в строку литеральный пул, и поэтому последующие вызовы, такие какString s1="hi"
, являются взято из пула? -
Является ли это тем, как работает основной механизм? Если это так, то
String s=new String("Test"); String s1="Test";
то же, что и
String s="Test"; String s1="Test";
с точки зрения использования и эффективности памяти?
-
Кроме того, есть ли способ, с помощью которого мы можем получить доступ к String Pool, чтобы проверьте, сколько литералов
String
присутствует в нем, сколько места занято и т.д.?