Разница между null и пустой ("") строкой Java

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

Я написал простой код:

String a = "";
String b = null;

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

оба заявления возвратить false. Похоже, я не могу найти в чем собственно разница между ними.

13 ответов


"" является фактической строкой, хотя и пустой.

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

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

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

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

a.length()

a.substring(0, 1)

и так далее.

если строка равна null, например b, Java бросит a NullPointerException если вы пытались ссылаться, сказал:

b.length()


если разница, которую вы задаетесь вопросом о == по сравнению с равными, это так:

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

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

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

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

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

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

вы могли бы подумать, что выход будет false, так как он должен выделять два разных Веревка. На самом деле, Java будет интерн литеральные строки (те, которые инициализируются как a и b в нашем примере). Поэтому будьте осторожны, потому что это может дать некоторые ложные срабатывания о том, как == работает.


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

Difference between null and 0/empty string


String является объектом и может быть null

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

" "является фактическим значением строки экземпляра объекта, например "aaa"

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


то, что ваши утверждения говорят вам, это просто то, что "" не то же самое, что null - что верно. ""является пустой строкой; null означает, что значение не назначено.

было бы более поучительно попробовать:

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

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


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


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

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

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

здесь мой аналогичный ответ


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

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


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


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

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

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());
    }
}

}


String s = "";
s.length();

String s = null;
s.length();

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

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


пустая строка отличается от нулевая ссылка в том, что в объектно-ориентированный язык программирования пустая ссылка типа String не указывает на объект String и вызовет ошибку, если кто-то попытается выполните любую операцию на нем. Пустота строка, еще строка, на которой можно попытаться выполнить строковые операции.

из статьи Википедии о пустая строка.


строка может быть пустой или иметь null значение. Если строка null, Это не относится ни к чему в памяти. Попробуй!--2-->. Это связано с тем, что если строка пуста, она все равно возвращает длину 0. Поэтому, если вы ничего не вводите для того же самого, он все равно будет продолжать цикл, так как он не регистрирует строку как null. В то время как если вы проверите длину, то она выйдет из цикла.


эта концепция может быть лучше понято из математики. Вы когда-нибудь пробовали делить число (не ноль) на 0 с помощью калькулятора e.g 7/0? Вы получите результат, который выглядит примерно так:undefined, not a number, null etc. Это означает, что операция невозможна по каким-то причинам (оставим эти причины для обсуждения в другой день).

теперь выполните следующее: 0/7. Вы получите выход, 0. Это означает, что операция возможна и может быть выполнена, но вы ответ просто 0, потому что после деления ничего не остается. Существует допустимый выход, и этот выход равен нулю.

в первом примере не только вывод был недопустимым, операция была невозможна для выполнения. Это сродни null строка в java. Второй пример сродни empty строку.