2011-01-26 89 views
104

null""(空字符串)之间的区别是什么?null和空(“”)Java字符串之间的区别

我已经写了一些简单的代码:

String a = ""; 
String b = null; 

System.out.println(a==b); // false 
System.out.println(a.equals(b)); // false 

两个语句返回false。看来,我无法找到它们之间的实际区别。

+5

与`b.equals(a)`比较 - 但不要用'=='来比较字符串“在其他方式中不起作用”。 'null'值(不同于空字符串`“”`,一个有效的String实例)可以永远不会调用它的方法。将“已知非空”(通常是一个常量值或文字)放在等号的左侧是“Yoda条件”或其他。 – 2011-01-26 06:57:12

回答

175

”“是一个实际的字符串,虽然是一个空字符串。

但是,这表示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的字符串)。所以要小心,因为这会对==的工作方式产生误解。

7

这里a is an Objectb(null)对象是空引用

System.out.println(a instanceof Object); // true 

System.out.println(b instanceof Object); // false 

here is我类似的回答

+1

`a`和`b`都是参考。 `a`是一个实例化对象的引用。 `b`是没有实例化对象的引用(因此术语“空引用”)。 – 2011-01-26 06:58:54

+0

我反作用-1 ;-)但它有助于澄清这个答案,并讨论“对象”和“空值”之间的区别以及对象和变量之间的差异。 – 2011-01-26 07:00:02

+0

@pst为什么是-1? :) – 2011-01-26 07:00:49

8

有两间漂亮的显著差异的链接。空字符串""是“没有字符的字符串”。这是一个具有明确定义长度的实际字符串。所有的标准字符串操作都在空字符串上明确定义 - 可以将其转换为小写字母,查找其中的某些字符的索引等。空字符串null是“根本没有字符串”。它没有长度,因为它根本不是字符串。尝试将任何标准字符串操作应用于空字符串将导致在运行时NullPointerException。 “

10

你的陈述告诉你的仅仅是“”与null不一样 - 这是真的。 “”是一个空字符串; null表示没有赋值。

这可能是更具启发性尝试:

System.out.println(a.length()); // 0 
System.out.println(b.length()); // error; b is not an object 

“”仍然是一个字符串,这意味着你可以调用它的方法,并得到有意义的信息。 null是一个空变量 - 这里几乎没有任何东西。

4

在Java中,分配给null的引用类型有根本没有值。一个字符串""有一个值:一个空字符串,也就是说一个没有字符的字符串。当一个变量被分配到null这意味着没有任何类型的基础对象,字符串或其他。

6

null表示该名称未引用任何实例化对象。 “”“”表示空字符串。

这里a正在引用一些碰巧是空字符串的对象。 b没有引用任何对象,因为它是空的。

1

空字符串不同于的是,在 面向对象的编程语言中的 空引用一个 空引用为字符串类型 不指向一个字符串对象和 将导致错误是不同一个试图对 执行任何操作。空的 字符串仍然是可能尝试使用 字符串操作的字符串。

来自维基百科对empty string的文章。

2

“” 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()); 
    } 
} 

}

3
String s = ""; 
s.length(); 

String s = null; 
s.length(); 

的引用为空字符串""指向堆中的对象 - 这样你就可以调用它的方法。

但是,指向null的引用没有任何对象指向堆,因此您将获得NullPointerException

0

字符串可以为空或具有null值。如果字符串是null,它不是指内存中的任何内容。试试s.length()>0。这是因为如果一个字符串是空的,它仍然返回0的长度。所以如果你不输入相同的内容,那么它仍然会继续循环,因为它不会将字符串注册为null。而如果你检查长度,那么它将退出它的循环。

66

你也可以理解为空和空字符串之间的区别是这样的:

Difference between null and 0/empty string

0

这个概念可以从数学来更好地理解。你有没有尝试用一个计算器(例如7/0)除以0(不为零)?你会得到一个看起来像这样的结果:undefined,not a number,null等。这意味着该操作是不可能的,由于某些原因(让我们离开那些原因,在另一天讨论)。

现在,执行此操作:0/7。您将得到输出0,这意味着该操作是可能的并且可以执行,但是您的答案仅为0,因为除法后没有任何操作。有一个有效的输出并且输出为零。

在第一个示例中,不仅输出无效,操作无法执行。这与java中的null字符串类似。第二个例子类似于empty字符串。

相关问题