null
和""
(空字符串)之间的区别是什么?null和空(“”)Java字符串之间的区别
我已经写了一些简单的代码:
String a = "";
String b = null;
System.out.println(a==b); // false
System.out.println(a.equals(b)); // false
两个语句返回false
。看来,我无法找到它们之间的实际区别。
null
和""
(空字符串)之间的区别是什么?null和空(“”)Java字符串之间的区别
我已经写了一些简单的代码:
String a = "";
String b = null;
System.out.println(a==b); // false
System.out.println(a.equals(b)); // false
两个语句返回false
。看来,我无法找到它们之间的实际区别。
”“是一个实际的字符串,虽然是一个空字符串。
但是,这表示String变量指向任何内容。
a==b
返回false,因为“”和null在内存中不占用相同的空间 - 换句话说,它们的变量不指向相同的对象。
a.equals(b)
返回false,因为显然不等于null。
不同的是,虽然认为,因为“”是一个实际的字符串,你仍然可以调用方法或功能上它像
a.length()
a.substring(0, 1)
等。
如果该字符串等于空,像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
弦乐将返回true 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的字符串)。所以要小心,因为这会对==的工作方式产生误解。
这里a is an Object
但b(null)
是不对象是空引用
System.out.println(a instanceof Object); // true
System.out.println(b instanceof Object); // false
here is我类似的回答
`a`和`b`都是参考。 `a`是一个实例化对象的引用。 `b`是没有实例化对象的引用(因此术语“空引用”)。 – 2011-01-26 06:58:54
我反作用-1 ;-)但它有助于澄清这个答案,并讨论“对象”和“空值”之间的区别以及对象和变量之间的差异。 – 2011-01-26 07:00:02
@pst为什么是-1? :) – 2011-01-26 07:00:49
字符串是一个对象,可以为null
null则表示该字符串对象未被实例化
“”就像是实例化对象的字符串的实际值“AAA”
下面是可能澄清这一点http://download.oracle.com/javase/tutorial/java/concepts/object.html
有两间漂亮的显著差异的链接。空字符串""
是“没有字符的字符串”。这是一个具有明确定义长度的实际字符串。所有的标准字符串操作都在空字符串上明确定义 - 可以将其转换为小写字母,查找其中的某些字符的索引等。空字符串null
是“根本没有字符串”。它没有长度,因为它根本不是字符串。尝试将任何标准字符串操作应用于空字符串将导致在运行时NullPointerException
。 “
你的陈述告诉你的仅仅是“”与null不一样 - 这是真的。 “”是一个空字符串; null表示没有赋值。
这可能是更具启发性尝试:
System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object
“”仍然是一个字符串,这意味着你可以调用它的方法,并得到有意义的信息。 null是一个空变量 - 这里几乎没有任何东西。
在Java中,分配给null
的引用类型有根本没有值。一个字符串""
有一个值:一个空字符串,也就是说一个没有字符的字符串。当一个变量被分配到null
这意味着没有任何类型的基础对象,字符串或其他。
null表示该名称未引用任何实例化对象。 “”“”表示空字符串。
这里a正在引用一些碰巧是空字符串的对象。 b没有引用任何对象,因为它是空的。
空字符串不同于的是,在 面向对象的编程语言中的 空引用一个 空引用为字符串类型 不指向一个字符串对象和 将导致错误是不同一个试图对 执行任何操作。空的 字符串仍然是可能尝试使用 字符串操作的字符串。
来自维基百科对empty string的文章。
“” and 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
,它不是指内存中的任何内容。试试s.length()>0
。这是因为如果一个字符串是空的,它仍然返回0的长度。所以如果你不输入相同的内容,那么它仍然会继续循环,因为它不会将字符串注册为null
。而如果你检查长度,那么它将退出它的循环。
这个概念可以从数学来更好地理解。你有没有尝试用一个计算器(例如7/0)除以0(不为零)?你会得到一个看起来像这样的结果:undefined
,not a number
,null
等。这意味着该操作是不可能的,由于某些原因(让我们离开那些原因,在另一天讨论)。
现在,执行此操作:0/7。您将得到输出0,这意味着该操作是可能的并且可以执行,但是您的答案仅为0,因为除法后没有任何操作。有一个有效的输出并且输出为零。
在第一个示例中,不仅输出无效,操作无法执行。这与java中的null
字符串类似。第二个例子类似于empty
字符串。
与`b.equals(a)`比较 - 但不要用'=='来比较字符串“在其他方式中不起作用”。 'null'值(不同于空字符串`“”`,一个有效的String实例)可以永远不会调用它的方法。将“已知非空”(通常是一个常量值或文字)放在等号的左侧是“Yoda条件”或其他。 – 2011-01-26 06:57:12