172

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

我写了一些简单的代码:

String a = "";
String b = null;

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

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

4

22 回答 22

323

你也可以这样理解 null 和空字符串的区别:

null 和 0/空字符串之间的区别

R. Sato ( @raysato )的原始图像

于 2017-08-21T10:33:38.420 回答
238

"" 是一个实际的字符串,尽管是一个空字符串。

但是,null 意味着 String 变量不指向任何内容。

a==b返回 false 因为 "" 和 null 在内存中不占用相同的空间——换句话说,它们的变量不指向相同的对象。

a.equals(b)返回 false 因为 "" 显然不等于 null。

不同之处在于,由于 "" 是一个实际的字符串,您仍然可以在其上调用方法或函数,例如

a.length()

a.substring(0, 1)

等等。

如果 String 等于 null,比如 b,NullPointerException如果你尝试调用,Java 会抛出 a,比如:

b.length()


如果您想知道的区别是 == 与 equals,那就是:

== 比较参考,就像我去了

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

那将输出 false 因为我分配了两个不同的对象,并且 a 和 b 指向不同的对象。

但是,a.equals(b)在这种情况下会返回 true,因为当且仅当参数 String 不为 null 并且表示相同的字符序列时equals, for Strings 才会返回 true 。

但请注意,Java 确实有字符串的特殊情况。

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

你会认为输出是false,因为它应该分配两个不同的字符串。实际上,Java 将实习文字字符串(在我们的示例中初始化为 a 和 b 的字符串)。所以要小心,因为这会对 == 的工作方式产生一些误报。

于 2011-01-26T06:56:10.300 回答
15

String 是一个 Object 并且可以为 null

null 表示未实例化字符串对象

"" 是实例化对象字符串的实际值,如 "aaa"

这是一个可能澄清这一点的链接http://download.oracle.com/javase/tutorial/java/concepts/object.html

于 2011-01-26T06:55:46.613 回答
13

您的陈述告诉您的只是“”与 null 不同-这是真的。"" 是一个空字符串;null 表示没有赋值。

尝试一下可能更有启发性:

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

"" 仍然是一个字符串,这意味着您可以调用它的方法并获取有意义的信息。null 是一个空变量——那里实际上什么都没有。

于 2011-01-26T06:56:23.063 回答
10

两者之间有相当显着的差异。空字符串""是“其中没有字符的字符串”。它是一个具有明确定义长度的实际字符串。所有标准的字符串操作都对空字符串进行了很好的定义——您可以将其转换为小写,查找其中某个字符的索引等。空字符串null是“根本没有字符串”。它没有长度,因为它根本不是字符串。尝试对空字符串应用任何标准字符串操作将NullPointerException在运行时导致 a。

于 2011-01-26T06:56:05.877 回答
9

这里a is an Objectb(null)不是一个对象是一个空引用

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

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

这是我的类似答案

于 2011-01-26T06:55:46.563 回答
8

null表示该名称未引用任何实例化对象。 ""表示一个空字符串。

这里a引用了一些恰好是空字符串的对象。b没有引用任何对象,因为它为空。

于 2011-01-26T06:57:25.477 回答
5

在 Java 中,分配的引用类型null根本没有任何价值。分配的字符串""有一个值:一个空字符串,也就是说一个没有字符的字符串。分配变量null时,意味着没有任何类型的基础对象,字符串或其他。

于 2011-01-26T06:57:16.077 回答
4

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

}

于 2015-06-30T13:05:31.787 回答
4
String s = "";
s.length();

String s = null;
s.length();

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

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

于 2015-08-14T14:32:46.760 回答
3

在此处输入图像描述

此图像可能会帮助您了解差异。

图片来自ProgrammerHumor

于 2019-10-15T01:25:26.100 回答
1

空字符串与空引用的不同之处在于,在面向对象的编程语言中,对字符串类型的空引用并不指向字符串对象,如果尝试对其执行任何操作,则会导致错误。空字符串仍然是可以尝试对其进行字符串操作的字符串。

来自关于空字符串的维基百科文章。

于 2011-01-26T06:59:02.747 回答
1

String s=null;

字符串未初始化为 null。如果尝试了任何字符串操作,它可能会抛出空指针异常

String t="null";

它是一个字符串文字,其值为字符串“null”,与 t =“xyz”相同。它不会抛出空指针。

String u="";

它是空字符串,它不会抛出空指针。

于 2019-04-20T09:01:55.460 回答
0

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

于 2016-12-04T17:16:05.030 回答
0

从数学中可以更好地理解这个概念。您是否曾尝试使用计算器(例如 7/0)将数字(不是零)除以 0?你会得到一个看起来像这样的结果:undefined,not a numbernull。这意味着由于某些原因无法进行操作(让我们改天讨论这些原因)。

现在,执行此操作:0/7。您将得到输出 0。这意味着该操作是可能的并且可以执行,但您的答案只是 0,因为除法之后什么都没有。有一个有效的输出并且该输出为零。

在第一个示例中,不仅输出无效,操作也无法执行。这类似于nulljava中的字符串。第二个例子类似于empty字符串。

于 2017-11-02T16:47:01.843 回答
0

当你写

String a = "";

这意味着有一个字符串类型的变量“a”指向字符串池中的对象引用,该对象引用的值为“”。由于变量a持有一个有效的字符串对象引用,字符串的所有方法都可以在这里应用。

而当你写

String b = null;

这意味着有一个bstring 类型的变量指向一个未知的引用。并且对未知引用的任何操作都会导致NullPointerException.

现在,让我们评估以下表达式。

System.out.println(a == b); // false. because a and b both points to different object reference

System.out.println(a.equals(b)); // false, because the values at object reference pointed by a and b do not match.

System.out.println(b.equals(a)); // NullPointerException, because b is pointing to unknown reference and no operation is allowed
于 2019-01-30T18:13:57.157 回答
0

简单来说,

  • "" 是一个空字符串

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

于 2019-06-25T08:54:44.327 回答
0

空字符串和空字符串之间的区别。例如:您有一个名为 x 的变量。如果你用JS写,

var x = "";

这意味着您分配了一个空字符串值(长度为 0)。实际上,这就像某种东西,但毫无感觉:)另一方面,

var y = null;

这意味着您没有为 y 分配一个值,在声明时通过向 y 写入 null 来明确表示。如果你写 y.length; 它将抛出一个错误,表明没有为 y 分配值,因此无法读取 y 的长度。

于 2020-01-30T05:23:02.780 回答
0

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

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

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

于 2020-06-17T05:49:41.293 回答
0

作为好奇

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

     s1 = s1 + s2;
   

    System.out.println((s); // nullhello
于 2020-06-20T10:43:19.650 回答
0

null没有任何意义;这意味着您从未为变量设置值,但为空意味着您已将“”值设置为您String的实例,请参见以下示例:

String str1;
String str2 = "";

这意味着您已经定义了它但尚未为其设置任何值,但是您已经为它定义str1并设置了空值,因此即使该值为“”,它也有一个值;nullstr2

于 2020-08-08T07:16:28.330 回答
0

惊人的答案,但我想从不同的角度给出。

String a = "StackOverflow";
String a1 = "StackOverflow" + "";
String a2 = "StackOverflow" + null;

System.out.println(a == a1); // true
System.out.println(a == a2); // false

所以这可以告诉我们""和null指向不同的对象引用。

于 2020-09-13T17:28:32.550 回答