1. введение
Java String является одним из самых важных классов, и мы уже рассмотрели многие его аспекты в нашей серии учебных пособий, связанных со строками .
В этом уроке мы сосредоточимся на инициализации String в Java.
2. Творение
Прежде всего, мы должны вспомнить, как создаются String s в Java.
Мы можем использовать ключевое слово new или буквальный синтаксис:
String usingNew = new String("baeldung"); String usingLiteral = "baeldung";
Кроме того, важно понимать, как строки управляются в специализированном пуле .
3. Только Строковое Объявление
Во-первых, давайте просто объявим String , не присваивая значение явно.
Мы можем сделать это либо локально, либо как переменная-член:
public class StringInitialization { String fieldString; void printDeclaredOnlyString() { String localVarString; // System.out.println(localVarString); -> compilation error System.out.println(fieldString); } }
Как мы видим, если мы попытаемся использовать localVarString перед тем, как дать ему значение, мы получим ошибку компиляции. С другой стороны, консоль покажет ” null” для field String ‘s value.
См., переменные-члены инициализируются значением по умолчанию при построении класса, null в случае String . Но, мы должны сами инициализировать локальные переменные.
Если мы дадим localVarString значение null , то увидим, что они действительно не равны:
String localVarString = null; assertEquals(fieldString, localVarString);
4. Инициализация Строк С Помощью Литералов
Теперь давайте создадим два String s, используя один и тот же литерал:
String literalOne = "Baeldung"; String literalTwo = "Baeldung";
Мы подтвердим, что создан только один объект, сравнив ссылки:
assertTrue(literalOne == literalTwo);
Причина этого восходит к тому факту, что строки хранятся в пуле . literal One добавляет String “baeldung” в пул и literalTwo повторно использует его.
5. Инициализация Строки С Помощью new
Однако мы увидим несколько иное поведение, если будем использовать ключевое слово new .
String newStringOne = new String("Baeldung"); String newStringTwo = new String("Baeldung");
Хотя значение обоих String s будет таким же, как и раньше, на этот раз нам придется обращаться к разным объектам:
assertFalse(newStringOne == newStringTwo);
6. Пустые Строки
Давайте теперь создадим три пустых String s:
String emptyLiteral = ""; String emptyNewString = new String(""); String emptyNewStringTwo = new String();
Как мы уже знаем, пустой литерал будет добавлен в пул String , в то время как два других идут непосредственно в кучу.
Хотя это не будут одни и те же объекты, все они будут иметь одинаковое значение:
assertFalse(emptyLiteral == emptyNewString) assertFalse(emptyLiteral == emptyNewStringTwo) assertFalse(emptyNewString == emptyNewStringTwo) assertEquals(emptyLiteral, emptyNewString); assertEquals(emptyNewString, emptyNewStringTwo);
7. нулевые значения
Наконец, давайте посмотрим, как ведут себя null String s.
Давайте объявим и инициализируем null String :
String nullValue = null;
Если бы мы напечатали NullValue , то увидели бы слово “null”, как мы видели ранее. И если мы попытаемся вызвать какие – либо методы на NullValue, мы получим NullPointerException, как и ожидалось.
Но, почему “null” печатается? Что такое null на самом деле?
Ну, спецификация JVM говорит, что null является значением по умолчанию для всех ссылок, поэтому оно специально не привязано к String . И на самом деле спецификация не требует какой-либо конкретной кодировки значения для null .
Итак, откуда берется “null” для печати a Строка а потом?
Если мы посмотрим на реализацию PrintStream# println , то увидим, что она вызывает String#valueOf :
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
И, если мы посмотрим на String#valueOf, мы получим наш ответ:
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
И, очевидно, именно в этом причина “null”.
8. Заключение
В этой статье мы рассмотрели String инициализацию. Мы объяснили разницу между объявлением и инициализацией. Мы также коснулись использования new и использования литерального синтаксиса.
Наконец, мы рассмотрели , что значит присвоить значение null строке , как значение null представлено в памяти и как оно выглядит при печати.
Все примеры кода, использованные в статье, доступны на Github .