null
和""
(空字符串)有什么区别?
我写了一些简单的代码:
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()
如果您想知道的差异是==与等于,那就是:
==比较引用,就像我去的那样
String a = new String("");
String b = new String("");
System.out.println(a==b);
这会输出错误,因为我分配了两个不同的对象,而a和b指向不同的对象。
但是,在这种情况下a.equals(b)
将返回true,因为字符串的equals
将返回真正的if and only if the argument String is not null and represents the same sequence of characters.
但请注意,Java确实有一个针对字符串的特殊情况。
String a = "abc";
String b = "abc";
System.out.println(a==b);
你会认为输出是false
,因为它应该分配两个不同的字符串。实际上,Java将intern文字字符串(在我们的例子中初始化为a和b的字符串)。所以要小心,因为这会对==如何工作产生一些误报。
String s = "";
s.length();
String s = null;
s.length();
对空字符串""
的引用指向堆中的对象 - 因此您可以在其上调用方法。
但是指向null
的引用无法指向堆中,因此您将获得NullPointerException
。
空字符串与空引用的区别在于,在面向对象的编程语言中,对字符串类型的空引用不指向字符串对象,并且会导致错误,尝试对其执行任何操作。空字符串仍然是可以尝试字符串操作的字符串。
来自维基百科关于empty string的文章。
字符串可以为空或具有null
值。如果字符串是null
,则它不是指内存中的任何内容。试试s.length()>0
。这是因为如果一个字符串是空的,它仍然返回0的长度。所以如果你没有为它输入任何东西,那么它仍然会继续循环,因为它没有将字符串注册为null
。然而,如果你检查长度,那么它将退出它的循环。
从数学上可以更好地理解这个概念。您是否曾尝试使用计算器(如7/0)将数字(非零)除以0?你会得到一个看起来像这样的结果:undefined
,not a number
,null
等。这意味着操作是不可能的,出于某些原因(让我们将这些理由留待另一天讨论)。
现在,执行:0/7。你将获得输出,这意味着操作是可能的并且可以执行,但你的答案只是0,因为除法后没有剩下任何东西。有一个有效的输出,输出为零。
在第一个示例中,不仅输出无效,而且无法执行操作。这类似于java中的null
字符串。第二个例子类似于empty
字符串。
我另外观察到虽然空字符串是一个空字符串,但它仍然保存有效的内存地址。但是NULL指针将指向什么。
https://shirleyanengineer.blogspot.com/2019/01/does-empty-string-has-address.html
当你写作
String a = "";
这意味着存在一个类型字符串的变量'a',它指向字符串池中的对象引用,其值为“”。由于变量a
持有有效的字符串对象引用,因此可以在此处应用string的所有方法。
而你写的时候
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
String s=null;
字符串未初始化为null。如果任何字符串操作尝试它可以抛出空指针异常
String t="null";
它是一个字符串文字,其值字符串“null”与t =“xyz”相同。它不会抛出空指针。
String u="";
它是空字符串,它不会抛出空指针。
简单来说,
String是一个Object,可以为null
null表示未实例化String对象
“”是实例化的对象字符串的实际值,如“aaa”
这是一个链接,可能澄清点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
here is我的类似答案
null表示该名称未引用任何实例化对象。 “”表示空字符串。
这里是一个引用一些恰好是空字符串的对象。 b没有引用任何对象,因为它为null。
在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());
}
}
}