Мне было любопытно, почему строки могут быть созданы без вызова 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присутствует в нем, сколько места занято и т.д.?