Рубрики
Без рубрики

Инициализация строк в Java

Узнайте о разнице между объявлением и инициализацией строки в Java.

Автор оригинала: baeldung.

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 .