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
。看来,我无法找到它们之间的实际区别。
Answers:
“”是实际字符串,尽管是空字符串。
但是,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一样初始化的字符串)。因此请小心,因为这可能会给==的工作方式带来一些误报。
intern
已过期。您可以参考另一个站点来阅读它:weblogs.java.net/blog/enicholas/archive/2006/06/…–
String a = null
,然后在打印时附加一个字符串,如a+= "example"
,为什么在显示nullexample
空值不是字符串的情况下显示?
"num: " + 20
给你字符串"num: 20"
。这是否表示20
一个字符串?(不是,20
是数字)。同样的情况null
:它不是字符串,但是如果您尝试添加它,则可以将其转换为一个字符串。
字符串是一个对象,可以为null
null表示未实例化String对象
“”是实例化对象字符串的实际值,例如“ aaa”
这是一个可以阐明这一点的链接http://download.oracle.com/javase/tutorial/java/concepts/object.html
if (mp==null){do something}
。
两者之间有相当大的差异。空字符串""
是“其中没有字符的字符串”。这是一个具有明确定义长度的实际字符串。所有标准字符串操作在空字符串上都有明确定义-您可以将其转换为小写字母,在其中查找某些字符的索引,等等。空字符串null
是“完全没有字符串”。它没有长度,因为它根本不是字符串。尝试对空字符串应用任何标准字符串操作将NullPointerException
在运行时导致a 。
了这里a is an Object
却b(null)
是没有一个对象是空引用
System.out.println(a instanceof Object); // true
System.out.println(b instanceof Object); // false
这是我的类似答案
a
并b
都引用。 a
是带有实例化对象的引用。 b
是没有实例化对象的引用(因此称为“空引用”)。
null表示名称未引用任何实例化的对象。 “”表示一个空字符串。
在这里,a引用的是一个空字符串的对象。b没有引用任何对象,因为它为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
。
空字符串与null引用的不同之处在于,在面向对象的编程语言中,对字符串类型的null引用不会指向字符串对象,并且如果尝试对它执行任何操作都会导致错误。空字符串仍然是可以尝试进行字符串操作的字符串。
摘自维基百科有关空字符串的文章。
String s=null;
字符串未初始化为null。如果尝试任何字符串操作,则可能引发空指针异常
String t="null";
它是一个字符串文字,其值字符串为“ null”,类似于t =“ xyz”。它不会抛出空指针。
String u="";
它为空字符串,不会抛出空指针。
从数学上可以更好地理解这个概念。您是否曾经尝试使用计算器(例如7/0)将数字(非零)除以0?你会得到一个结果,看起来像这样的东西:undefined
,not a number
,null
等等。这意味着操作是不可能的,因为某些原因(让我们离开这些原因将要讨论的另一天)。
现在,执行以下操作:0/7。您将获得输出0。这意味着该操作是可能的并且可以执行,但是您的答案仅为0,因为除法后没有任何剩余。存在有效输出,并且该输出为零。
在第一个示例中,不仅输出无效,而且该操作无法执行。这类似于null
java中的字符串。第二个例子类似于empty
字符串。
当你写
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
此图像可以帮助您了解差异。
该图像是从ProgrammerHumor收集的
“我称之为十亿美元的错误。这是1965年发明空引用的原因” -https://en.wikipedia.org/wiki/Tony_Hoare
关于现实世界,可以假定两者相同。它只是一种编程语言的语法,这在两者之间造成了差异,这在其他人的解释中。这只会增加开销,例如在检查/比较字符串变量是否包含某些内容时,您必须首先检查其是否不为null,然后再进行实际的字符串比较,即两次比较。对于每个字符串比较,这都是处理能力的浪费。
Objects.equals()在调用.equals()之前检查null。
b.equals(a)
- 比较,但不要==
用于字符串比较,因为在其他方面“不起作用”。该null
值(不同于一个空字符串""
,一个有效的String实例)永远不能对其调用方法。在等式的左侧放置“已知非空”(通常为常数或文字)是“ Yoda条件”或类似的东西。