Java字符串中null和空字符串("")之间的区别

187

空值(null)和空字符串("")有什么区别?

我写了一些简单的代码:

String a = "";
String b = null;

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

这两个语句都返回false。看来,我找不到它们之间的实际区别。


7
b.equals(a)相比较--但不要使用==进行字符串比较,因为在其他方面"它不起作用"。null值(与空字符串 "" 不同,后者是有效的 String 实例)永远不能调用方法。将“已知非空”的值(通常是常量或文字)放在等式的左侧被称为“Yoda 条件语句”或类似的东西。 - user166390
22个回答

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

String s = null;
s.length();

引用一个空字符串""指向堆中的一个对象 - 因此您可以在其上调用方法。

但是,指向null的引用没有对象指向堆,因此您将得到NullPointerException


2

String s=null;

字符串s未初始化为null。如果进行任何字符串操作,可能会抛出空指针异常。

String t="null";

它是一个具有字符串值“null”的字符串字面量,就像t =“xyz”一样。它不会抛出空指针异常。

String u="";

它是一个空字符串,不会抛出空指针异常。


2
空字符串与空引用不同,因为在面向对象的编程语言中,对于字符串类型的空引用并不指向一个字符串对象,如果尝试对其执行任何操作将会导致错误。空字符串仍然是一个字符串,可以进行字符串操作。
来自空字符串的维基百科文章。

2

null 表示什么都没有;它意味着您从未为变量设置值,但是空值表示您已将 "" 值设置为您的 String。例如,请参见以下示例:

String str1;
String str2 = "";

这里的str1null,意味着你已经定义了它,但还没有为其设置任何值。但是你已经定义了str2并将其设置为空值,因此它有一个值,即使该值是""str1可以与其他字符串进行比较,但当比较str2时,会在RuntimeException中抛出NullPointerException异常。

1

简单来说,

  • "" 是一个空的字符串

  • null 是一个空的字符串变量


0
一个字符串可以是空的或者有 null 值。如果一个字符串是 null,它不引用任何内存中的内容。尝试使用 s.length()>0。这是因为如果一个字符串是空的,它仍然返回长度为 0。所以如果你对相同的东西什么都不输入,那么它仍然会继续循环,因为它不会将该字符串注册为 null。而如果你检查长度,那么它会退出它的循环。

0

这个概念可以从数学上更好地理解。您曾经尝试使用计算器将一个数字(而不是零)除以0,例如7/0吗?你会得到一个看起来像这样的结果:undefinednot a numbernull等。这意味着这个操作是不可能的,出于某些原因(让我们把这些原因留待另一天讨论)。

现在,执行以下操作:0/7。你会得到输出值0。这意味着这个操作是可能的并且可以执行,但是答案只是0,因为在除法之后没有剩余物品。有一个有效的输出和这个输出值为零。

在第一个例子中,输出不仅无效,而且操作不可能执行。这类似于Java中的null字符串。第二个例子类似于empty字符串。


0

作为一个好奇心

    String s1 = null;
    String s2 = "hello";

     s1 = s1 + s2;
   

    System.out.println((s); // nullhello

0

“我称它为我的亿万美元错误。这是在1965年发明了空引用。” - https://en.wikipedia.org/wiki/Tony_Hoare

就现实世界而言,两者可以被认为是相同的。只是编程语言的语法会导致两者之间的差异,正如其他人在这里所解释的那样。这仅仅会产生额外的开销,例如当检查/比较字符串变量是否有内容时,您必须首先检查它是否不为空,然后才能进行实际的字符串比较,即进行两次比较。这对于每个字符串比较来说都是一种浪费处理能力的方式。

Objects.equals() 在调用 .equals() 之前检查 null。


0

空字符串和null的区别。例如:你有一个名为x的变量。如果你在JS中写入:

var x = "";

这意味着你已经赋了一个空字符串(长度为0)的值。实际上,这就像是一些东西,但感觉上什么都没有 :) 另一方面,

var y = null;

这意味着你在声明时没有给y赋值,明确地写入了null。如果你写y.length;它会抛出一个错误,表示没有给y赋值,因此无法读取y的长度。


问题是关于Java的。 - Vega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接