Разница между нулевым и пустым ("") Java String - PullRequest
131 голосов
/ 26 января 2011

В чем разница между null и "" (пустая строка)?

Я написал несколько простых кодов:

String a = "";
String b = null;

System.out.println(a == b); // false
System.out.println(a.equals(b)); // false

Оба оператора возвращают false.Кажется, я не могу найти, в чем же разница между ними.

Ответы [ 17 ]

202 голосов
/ 26 января 2011

"" - это действительная строка, хотя и пустая.

null, однако, означает, что переменная String указывает на ничто.

a==b возвращает false, потому что "" и null не занимают одно и то же место в памяти - другими словами, их переменные не указывают на одни и те же объекты.

a.equals(b) возвращает false, потому что "" не равно нулю, очевидно.

Разница в том, что, так как "" является реальной строкой, вы все равно можете вызывать методы или функции для нее, например

a.length()

a.substring(0, 1)

и т. Д.

Если строка равна нулю, как b, Java выдаст NullPointerException, если вы попытаетесь вызвать, скажите:

b.length()


Если разница, которая вас интересует, равна == против равных, то это:

== сравнивает ссылки, как если бы я пошел

String a = new String("");
String b = new String("");
System.out.println(a==b);

Это выведет false, потому что я выделил два разных объекта, а a и b указывают на разные объекты.

Однако a.equals(b) в этом случае вернет true, потому что equals для Strings вернет true тогда и только тогда, когда аргумент String не равен нулю и представляет ту же последовательность символов.

Имейте в виду, однако, что в Java есть особый случай для строк.

String a = "abc";
String b = "abc";
System.out.println(a==b);

Можно подумать, что вывод будет false, поскольку он должен распределять две разные строки. Фактически, Java будет intern литеральными строками (те, которые инициализируются как a и b в нашем примере). Так что будьте осторожны, потому что это может дать некоторые ложные срабатывания о том, как == работает.

189 голосов
/ 21 августа 2017

Вы также можете понять разницу между нулевой и пустой строкой следующим образом:

Difference between null and 0/empty string

13 голосов
/ 26 января 2011

String является объектом и может иметь значение null

null означает, что объект String не был создан

"" - это фактическое значение экземпляра Object String, например "aaa"

Вот ссылка, которая может прояснить этот момент http://download.oracle.com/javase/tutorial/java/concepts/object.html

12 голосов
/ 26 января 2011

В ваших утверждениях говорится, что «» - это не то же самое, что «ноль» - это правда. «» - пустая строка; NULL означает, что значение не было присвоено.

Возможно, будет полезнее попробовать:

System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object

"" по-прежнему является строкой, то есть вы можете вызывать ее методы и получать значимую информацию. null - пустая переменная - там буквально ничего нет.

9 голосов
/ 26 января 2011

Есть довольно существенная разница между ними. Пустая строка "" - это строка, в которой нет символов. Это фактическая строка, которая имеет четко определенную длину. Все стандартные строковые операции четко определены в пустой строке - вы можете преобразовать ее в нижний регистр, найти индекс некоторого символа в ней и т. Д. Нулевая строка null - это «вообще нет строки». У него нет длины, потому что это вовсе не строка. Попытка применить любую стандартную строковую операцию к пустой строке приведет к NullPointerException во время выполнения.

9 голосов
/ 26 января 2011

здесь a is an Object но b(null) - это не Объект - это нулевая ссылка

System.out.println(a instanceof Object); // true

System.out.println(b instanceof Object); // false

вот мой аналогичный ответ

8 голосов
/ 26 января 2011

null означает, что имя не ссылается ни на один экземпляр объекта. "" означает пустую строку.

Здесь a ссылается на некоторый объект, который оказывается пустой строкой. b не ссылается ни на один объект, так как он нулевой.

5 голосов
/ 26 января 2011

В Java назначенный ссылочный тип null не имеет значения вообще . Строка, присвоенная "", имеет значение: пустая строка, то есть строка без символов. Когда переменной присваивается null, это означает, что не существует какого-либо нижележащего объекта, строки или другого.

4 голосов
/ 14 августа 2015
String s = "";
s.length();

String s = null;
s.length();

Ссылка на пустую строку "" указывает на объект в куче - так что вы можете вызывать методы для него.

Но ссылка, указывающая на null, не имеет объекта для указания в куче, и, таким образом, вы получите NullPointerException.

4 голосов
/ 30 июня 2015

"" и null оба различаются.первый означает, что как часть объявления строковой переменной в строковом пуле была создана строковая константа, и для нее было выделено некоторое количество памяти.

Но когда мы объявляем это с null тогда это был только что созданный экземпляр jvm, но для него не было выделено памяти.поэтому, если вы пытаетесь получить доступ к этому объекту, проверив его с помощью "" - пустой переменной, это не может предотвратить исключение nullpointerexception.Ниже приведен один пример использования.

public class StringCheck {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    String s1 = "siddhartha";
    String s2 = "";
    String s3 = null;

    System.out.println("length s1 ="+s1.length());
    System.out.println("length s2 ="+s2.length());

    //this piece of code will still throw nullpointerexception . 
    if(s3 != ""){
        System.out.println("length s3 ="+s3.length());
    }
}

}

...