null和空(“”)Java字符串之间的区别

Difference between null and empty (“”) Java String

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

我写了一些简单的代码:

1
2
3
4
5
String a ="";
String b = null;

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

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


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

但是,null表示String变量不指向任何内容。

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

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

区别在于尽管由于"是实际的字符串,所以您仍然可以像上面那样调用方法或函数

a.length()

a.substring(0, 1)

等等。

如果String等于null,例如b,如果您尝试调用,Java会抛出NullPointerException,说:

b.length()

如果您想知道的差异是==与equals,那就是:

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

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

由于我分配了两个不同的对象,而a和b指向不同的对象,因此输出false。

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

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

1
2
3
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对象

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

这是一个可以阐明这一点的链接http://download.oracle.com/javase/tutorial/java/concepts/object.html


您的陈述告诉您的只是"与null不同-是的。"是一个空字符串; null表示未分配任何值。

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

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

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


两者之间有相当大的区别。空字符串""是"其中没有字符的字符串"。这是一个具有明确定义长度的实际字符串。所有标准字符串操作在空字符串上都有明确定义-您可以将其转换为小写字母,在其中查找某些字符的索引,等等。空字符串null是"完全没有字符串"。它没有长度,因为它根本不是字符串。尝试对空字符串应用任何标准字符串操作将在运行时导致NullPointerException


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

1
2
3
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。请在下面的一个用例中查找。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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());
    }
}

}


1
2
3
4
5
String s ="";
s.length();

String s = null;
s.length();

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

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


String s=null;

字符串未初始化为null。如果尝试任何字符串操作,则可能引发空指针异常

String t="null";

它是一个字符串文字,其值字符串为" null",类似于t =" xyz"。它不会抛出空指针。

String u="";

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


The empty string is distinct from a
null reference in that in an
object-oriented programming language a
null reference to a string type
doesn't point to a string object and
will cause an error were one to try to
perform any operation on it. The empty
string is still a string upon which
string operations may be attempted.

摘自维基百科上有关空字符串的文章。


简单来说

  • "是一个空字符串

  • null是一个空的String变量。


字符串可以为空或具有null值。如果字符串是null,则它不指向内存中的任何内容。尝试s.length()>0。这是因为如果字符串为空,则其长度仍为0。因此,如果您不输入任何内容,则它将继续循环,因为它没有将字符串注册为null。而如果您检查长度,则它将退出循环。


从数学上可以更好地理解这个概念。您是否尝试过使用7/0等计算器将数字(非零)除以0?您将得到类似于以下内容的结果:undefinednot a numbernull等。这意味着由于某些原因,该操作是不可能的(让我们将这些原因留待以后讨论)。

现在,执行以下操作:0/7。您将获得输出0。这意味着该操作是可能的并且可以执行,但是您的答案仅为0,因为除法后没有任何剩余。存在有效输出,并且该输出为零。

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


当你写

String a ="";

这意味着存在一个字符串类型的变量" a",该变量指向字符串池中具有值""的对象引用。由于变量a持有有效的字符串对象引用,因此可以在此处应用字符串的所有方法。

而当你写

String b = null;

这意味着存在类型为string的变量b,该变量指向未知引用。并且对未知引用进行的任何操作都将导致NullPointerException

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

1
2
3
4
5
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