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


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

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

String a = "";
String b = null;

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

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

13 119

13 ответов:

"" - это строка, хотя и пустой.

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

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

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

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

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

вот ссылка, которая может прояснить этот момент 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 это "нет строки вообще.- У него нет длины, потому что это вовсе не струна. Попытка применить любой стандарт строковая операция с нулевой строкой вызовет NullPointerException во время выполнения.

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

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

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

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

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

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

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

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

}

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

String s = null;
s.length();

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

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

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

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

строка может быть пустой или иметь null значение. Если строка null, Это не относится ни к чему в памяти. Попробуй s.length()>0. Это связано с тем, что если строка пуста, она все равно возвращает длину 0. Поэтому, если вы ничего не вводите для того же самого, то он все равно будет продолжать цикл, так как он не регистрирует строку как null. Тогда как если вы проверите длину, то он выйдет из своего цикла.

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

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

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