空值(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)
等等。
如果字符串为null,比如b,如果您尝试调用以下代码,Java将抛出NullPointerException:
NullPointerException
b.length()
if (obj1 == obj2) {
String a = new String("");
String b = new String("");
System.out.println(a==b);
a.equals(b)
将返回true,因为字符串的equals
方法只有在参数字符串不为空且表示相同字符序列 时才返回true。String a = "abc";
String b = "abc";
System.out.println(a==b);
false
,因为它应该分配两个不同的字符串。实际上,Java会intern字面字符串(像我们示例中的a和b一样初始化的字符串)。所以要小心,因为这可能会导致==的一些误报。String a = null
,然后我用 a+= "example"
追加 一个字符串,当我打印它时,为什么会显示 nullexample
,因为 null 不是一个字符串? - cpinamtz"num: " + 20
将给出字符串 "num: 20"
。这是否意味着 20
是一个字符串?(不是的,20
是一个数字)。对于 null
也是同样的情况:它不是一个字符串,但如果你尝试添加它,它可以被转换为一个字符串。 - daborossnull == "" = false
(预期)但在语言的一些奇怪特性中,0 == "" = true
(嗯嗯)。 - pstantonString是一个对象,可以为null。
null表示该String对象未被实例化。
""是已实例化的String对象的实际值,例如"aaa"。
这里有一个链接可能会澄清这一点http://download.oracle.com/javase/tutorial/java/concepts/object.html
if (mp==null){做某事}
。 - Azurespot你的语句告诉你的是 "" 不等于 null,这是正确的。"" 是一个空字符串;null意味着未分配任何值。
也许尝试以下代码会更有启发性:
System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object
""仍然是一个字符串,这意味着你可以调用它的方法并获取有意义的信息。null是一个空变量 - 没有任何东西。
这两者之间有相当大的区别。空字符串""
是“没有任何字符的字符串”。它是一个实际的字符串,具有明确定义的长度。所有标准的字符串操作都可以在空字符串上进行 - 您可以将其转换为小写,查找其中某个字符的索引等。而null字符串null
是“根本没有字符串”。它没有长度,因为它根本不是一个字符串。尝试对null字符串应用任何标准的字符串操作都会在运行时导致NullPointerException
。
a是一个对象
,但b(null)
不是一个对象,它是一个空引用。System.out.println(a instanceof Object); // true
System.out.println(b instanceof Object); // false
a
和b
都是引用类型。a
是一个具有实例化对象的引用,而b
是一个没有实例化对象的引用(因此称为“空引用”)。 - JUST MY correct OPINIONnull
值之间的区别以及对象和变量之间的区别。 - user166390null 表示名称没有引用任何已实例化的对象。 "" 表示空字符串。
这里 a 引用了一个对象,该对象恰好是一个空字符串。 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());
}
}
}
b.equals(a)
相比较--但不要使用==
进行字符串比较,因为在其他方面"它不起作用"。null
值(与空字符串""
不同,后者是有效的 String 实例)永远不能调用方法。将“已知非空”的值(通常是常量或文字)放在等式的左侧被称为“Yoda 条件语句”或类似的东西。 - user166390