null和空(“”)Javastring之间的区别

null"" (空string)有什么区别?

我写了一些简单的代码:

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

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

“”是一个实际的string,虽然是空的。

但是,null表示Stringvariables指向无。

a==b返回false,因为“”和null在内存中不占用相同的空间 – 换句话说,它们的variables不指向相同的对象。

a.equals(b)返回false,因为显然不等于null。

不同的是,由于“”是一个实际的string,你仍然可以像调用方法或函数

a.length()

a.substring(0, 1)

等等。

如果String等于null,就像b一样,如果你尝试调用,Java会抛出一个NullPointerException

b.length()


如果你想知道的差别是==相等,那就是:

==比较引用,如果我去了

 String a = new String(""); String b = new String(""); System.out.println(a==b); 

这将输出错误,因为我分配了两个不同的对象,a和b指向不同的对象。

但是,在这种情况下, a.equals(b)将返回true,因为当且仅当参数String不为null并且表示相同的字符序列时,String的 equals将返回true 。

但是要警告的是,Java对Strings有一个特殊的例子。

 String a = "abc"; String b = "abc"; System.out.println(a==b); 

你会认为输出是false ,因为它应该分配两个不同的string。 实际上,Java将实习string(在我们的例子中,被初始化为a和b)。 所以要小心,因为这可能会导致错误的==如何工作。

你也可以这样理解null和空string的区别:

null和0 /空字符串之间的区别

string是一个对象,可以为空

null表示string对象没有实例化

“”是实例化对象string的实际值,如“aaa”

这里是一个链接,可以澄清这一点http://download.oracle.com/javase/tutorial/java/concepts/object.html

你的言论告诉你的仅仅是“”与“空”是不一样的 – 这是真的。 “”是一个空string; null表示没有赋值。

尝试一下可能会更有启发性:

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

“”仍然是一个string,这意味着你可以调用它的方法并获得有意义的信息。 null是一个空variables – 这里几乎没有任何东西。

两者之间有很大的差别。 空string""是“没有字符的string”。 这是一个具有明确定义的长度的实际string。 所有的标准string操作都是在空string上定义好的 – 你可以把它转换成小写字母,查找它中某些字符的索引等。空stringnull是“根本就没有string”。 它没有长度,因为它根本不是string。 尝试将任何标准string操作应用于空string将在运行时导致NullPointerException

null表示该名称不引用任何实例化对象。 “”表示空string。

这里是引用一些碰巧是空string的对象。 b没有引用任何对象,因为它是空的。

这里a is an Objectb(null) 不是一个Object,它是一个空引用

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

这里是我的类似的答案

在Java中,分配null的引用types根本没有值 。 一个赋值为""的string有一个值:一个空string,也就是说一个没有字符的string。 当一个variables被赋值为null这意味着没有任何types的基础对象,string或其他。

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

对一个空string""引用指向堆中的一个对象 – 所以你可以调用它的方法。

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

“”null都是不同的。 第一个意思是作为stringvariables声明的一部分,string常量已经在string池中创build,并且一些内存已经被分配了相同的内容。

但是当我们用null声明它时,它刚刚被实例化了jvm,但是没有分配内存。 因此,如果您尝试通过使用空格variables来检查该对象,则无法防止nullpointerexception。 请在下面find一个用例。

 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与空引用截然不同,在面向对象的编程语言中,对stringtypes的空引用不指向string对象,并且会导致错误,试图对其执行任何操作。 空string仍然是可以尝试string操作的string。

从维基百科文章中的空string 。

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

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

现在,执行这个:0/7。 你将得到输出0,这意味着操作是可能的,可以执行,但你的答案只是0,因为没有什么是分割后剩下的。 有一个有效的输出,输出为零。

在第一个例子中,不仅输出无效,操作也不可能执行。 这与java中的nullstring类似。 第二个例子类似于emptystring。