null
和""
(空字符串)有什么区别?
我写了一些简单的代码:
String a = "";
String b = null;
System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
两个语句都返回false
。看来,我无法找到它们之间的实际区别。
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,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 的字符串)。所以要小心,因为这会对 == 的工作方式产生一些误报。
String 是一个 Object 并且可以为 null
null 表示未实例化字符串对象
"" 是实例化对象字符串的实际值,如 "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。
这里a is an Object
但b(null)
不是一个对象它是一个空引用
System.out.println(a instanceof Object); // true
System.out.println(b instanceof Object); // false
这是我的类似答案
null表示该名称未引用任何实例化对象。 ""表示一个空字符串。
这里a引用了一些恰好是空字符串的对象。b没有引用任何对象,因为它为空。
在 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());
}
}
}
String s = "";
s.length();
String s = null;
s.length();
对空字符串的引用""
指向堆中的一个对象——因此您可以在其上调用方法。
但是指向的引用null
没有指向堆中的对象,因此您将得到一个NullPointerException
.
此图像可能会帮助您了解差异。
图片来自ProgrammerHumor
空字符串与空引用的不同之处在于,在面向对象的编程语言中,对字符串类型的空引用并不指向字符串对象,如果尝试对其执行任何操作,则会导致错误。空字符串仍然是可以尝试对其进行字符串操作的字符串。
来自关于空字符串的维基百科文章。
String s=null;
字符串未初始化为 null。如果尝试了任何字符串操作,它可能会抛出空指针异常
String t="null";
它是一个字符串文字,其值为字符串“null”,与 t =“xyz”相同。它不会抛出空指针。
String u="";
它是空字符串,它不会抛出空指针。
字符串可以为空或有null
值。如果字符串是null
,则它不引用内存中的任何内容。试试s.length()>0
。这是因为如果一个字符串是空的,它仍然返回长度 0。所以如果你没有输入相同的内容,那么它仍然会继续循环,因为它没有将字符串注册为null
. 而如果您检查长度,那么它将退出它的循环。
从数学中可以更好地理解这个概念。您是否曾尝试使用计算器(例如 7/0)将数字(不是零)除以 0?你会得到一个看起来像这样的结果:undefined
,not a number
等null
。这意味着由于某些原因无法进行操作(让我们改天讨论这些原因)。
现在,执行此操作:0/7。您将得到输出 0。这意味着该操作是可能的并且可以执行,但您的答案只是 0,因为除法之后什么都没有。有一个有效的输出并且该输出为零。
在第一个示例中,不仅输出无效,操作也无法执行。这类似于null
java中的字符串。第二个例子类似于empty
字符串。
当你写
String a = "";
这意味着有一个字符串类型的变量“a”指向字符串池中的对象引用,该对象引用的值为“”。由于变量a
持有一个有效的字符串对象引用,字符串的所有方法都可以在这里应用。
而当你写
String b = null;
这意味着有一个b
string 类型的变量指向一个未知的引用。并且对未知引用的任何操作都会导致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
简单来说,
"" 是一个空字符串
null 是一个空的字符串变量。
空字符串和空字符串之间的区别。例如:您有一个名为 x 的变量。如果你用JS写,
var x = "";
这意味着您分配了一个空字符串值(长度为 0)。实际上,这就像某种东西,但毫无感觉:)另一方面,
var y = null;
这意味着您没有为 y 分配一个值,在声明时通过向 y 写入 null 来明确表示。如果你写 y.length; 它将抛出一个错误,表明没有为 y 分配值,因此无法读取 y 的长度。
“我称其为我的十亿美元错误。这是 1965 年空引用的发明” - https://en.wikipedia.org/wiki/Tony_Hoare
就现实世界而言,两者都可以假设为相同。它只是一种编程语言的语法,它在两者之间产生了差异,正如其他人在此处所解释的那样。这只会产生开销,例如在检查/比较字符串变量是否具有某些内容时,您必须首先检查它是否不为空,然后进行实际字符串比较,即两次比较。这对于每个字符串比较来说都是一种处理能力的浪费。
Objects.equals() 在调用 .equals() 之前检查 null。
作为好奇
String s1 = null;
String s2 = "hello";
s1 = s1 + s2;
System.out.println((s); // nullhello
null
没有任何意义;这意味着您从未为变量设置值,但为空意味着您已将“”值设置为您String
的实例,请参见以下示例:
String str1;
String str2 = "";
这意味着您已经定义了它但尚未为其设置任何值,但是您已经为它定义str1
并设置了空值,因此即使该值为“”,它也有一个值;null
str2
但
惊人的答案,但我想从不同的角度给出。
String a = "StackOverflow";
String a1 = "StackOverflow" + "";
String a2 = "StackOverflow" + null;
System.out.println(a == a1); // true
System.out.println(a == a2); // false
所以这可以告诉我们""和null指向不同的对象引用。