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


151

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

我写了一些简单的代码:

String a = "";
String b = null;

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

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


6
b.equals(a)- 比较,但不要==用于字符串比较,因为在其他方面“不起作用”。该null值(不同于一个空字符串"",一个有效的String实例)永远不能对其调用方法。在等式的左侧放置“已知非空”(通常为常数或文字)是“ Yoda条件”或类似的东西。

Answers:


220

“”是实际字符串,尽管是空字符串。

但是,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);

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

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

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

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

您会认为输出为false,因为它应该分配两个不同的字符串。实际上,Java会实习文本字符串(在我们的示例中像a和b一样初始化的字符串)。因此请小心,因为这可能会给==的工作方式带来一些误报。


这也适用于C#吗?如“”的数组中的是{'\ 0'},则为null
Cole Johnson

3
关于的链接intern已过期。您可以参考另一个站点来阅读它:weblogs.java.net/blog/enicholas/archive/2006/06/…–
Alston

因此,如果我有一个空字符串String a = null,然后在打印时附加一个字符串,如a+= "example",为什么在显示nullexample空值不是字符串的情况下显示?
cpinamtz

@PinaGamer JavaScript允许在字符串中添加非字符串。"num: " + 20给你字符串"num: 20"。这是否表示20一个字符串?(不是,20是数字)。同样的情况null:它不是字符串,但是如果您尝试添加它,则可以将其转换为一个字符串。
daboross

@Zach L:当String s = null +“ a”时;它给出了输出nulla但null.concat(“ a”)给出了null指针异常。在我的第一种情况下null +“ a”是什么原因;正在工作。
Ved Prakash19年

249

您还可以通过以下方式了解null和空字符串之间的区别:

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

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


7
这很棒!我向某人解释了null vs空,并在您的回答发生了。这个概念立即吸引了他们。
matt.fc

14

字符串是一个对象,可以为null

null表示未实例化String对象

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

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


“ null表示未实例化String对象”-谢谢!可以帮助我了解很多东西。我曾经能够对MediaPlayer对象使用一次if语句,并且可以使用null来检查它是否正在运行(如果有的话可以执行一种方法),但是我从来不明白它为什么起作用,但是现在我明白了我在说什么,我正在使用null ...检查MediaPlayer是否已实例化if (mp==null){do something}
Azurespot 2014年

12

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

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

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

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


9

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


9

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

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

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

这是我的类似答案


1
双方ab都引用。 a是带有实例化对象的引用。 b是没有实例化对象的引用(因此称为“空引用”)。
正确的意见

我反作用于-1 ;-),但这将有助于澄清此答案,并讨论“对象”与null值之间的区别以及对象与变量之间的区别。

@pst谢谢:)我的答案是由心脏,因为这里是我的另一个回答类似这样的问题stackoverflow.com/questions/4459623/...

8

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

在这里,a引用的是一个空字符串的对象。b没有引用任何对象,因为它为null。


5

在Java中,分配了引用类型 null根本没有值。分配的字符串""具有一个值:空字符串,即其中没有字符的字符串。分配变量后,null就意味着不存在任何类型的基础对象(字符串或其他形式)。


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

}


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

String s = null;
s.length();

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

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


1

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

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


1

String s=null;

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

String t="null";

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

String u="";

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


0

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


0

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

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

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


0

当你写

String a = "";

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

而当你写

String b = null;

这意味着存在一个b字符串类型的变量,该变量指向未知的引用。并且对未知引用进行的任何操作都将导致出现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


0

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

var x = "";

这意味着您分配的值是空字符串(长度为0)。实际上,这有点像,但没有任何感觉:)另一方面,

var y = null;

这意味着您尚未为y分配一个值,该值在声明时将y写入y即可明确表示。如果你写y.length; 它将引发错误,表明没有分配给y的值,因此无法读取y的长度。


现在的问题是Java
维加


0

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

关于现实世界,可以假定两者相同。它只是一种编程语言的语法,这在两者之间造成了差异,这在其他人的解释中。这只会增加开销,例如在检查/比较字符串变量是否包含某些内容时,您必须首先检查其是否不为null,然后再进行实际的字符串比较,即两次比较。对于每个字符串比较,这都是处理能力的浪费。

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


0

出于好奇

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

     s1 = s1 + s2;
   

    System.out.println((s); // nullhello
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.