null和empty("")Java String之间的区别

Vik*_*dar 141 java string null equals referenceequals

null""(空字符串)有什么区别?

我写了一些简单的代码:

String a = "";
String b = null;

System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
Run Code Online (Sandbox Code Playgroud)

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

mik*_*qex 218

您也可以通过以下方式理解null和空字符串之间的区别:

null和0 /空字符串之间的差异

  • 这很棒!我正在向某人解释null vs empty并发生在你的回答上.这个概念立即点击了它们. (5认同)

Zac*_*h L 213

""是一个实际的字符串,虽然是空字符串.

但是,null表示String变量指向任何内容.

a==b 返回false,因为""和null不占用内存中的相同空间 - 换句话说,它们的变量不指向相同的对象.

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

不同之处在于,因为""是一个实际的字符串,你仍然可以在其上调用方法或函数

a.length()

a.substring(0, 1)

等等.

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

b.length()


如果您想知道的差异是==与等于,那就是:

==比较引用,就像我去的那样

String a = new String("");
String b = new String("");
System.out.println(a==b);
Run Code Online (Sandbox Code Playgroud)

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

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

但请注意,Java确实有一个针对字符串的特殊情况.

String a = "abc";
String b = "abc";
System.out.println(a==b);
Run Code Online (Sandbox Code Playgroud)

你会认为输出是false,因为它应该分配两个不同的字符串.实际上,Java将实习文字字符串(在我们的例子中初始化为a和b的字符串).所以要小心,因为这会对==如何工作产生一些误报.

  • 关于`intern`的链接已过期.您可以参考另一个站点来阅读它:https://weblogs.java.net/blog/enicholas/archive/2006/06/all_about_inter.html (3认同)

Aba*_*Dov 14

String是一个Object,可以为null

null表示未实例化String对象

""是实例化的对象字符串的实际值,如"aaa"

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


Ark*_*ito 12

你的陈述告诉你的只是""与null不同 - 这是真的.""是一个空字符串; null表示未分配任何值.

尝试可能更具启发性:

System.out.println(a.length()); // 0
System.out.println(b.length()); // error; b is not an object
Run Code Online (Sandbox Code Playgroud)

""仍然是一个字符串,这意味着您可以调用其方法并获取有意义的信息.null是一个空变量 - 那里几乎没有任何东西.


Saz*_*han 10

在此输入图像描述

这张图片可能会帮助您理解其中的差异。

图片收集自ProgrammerHumor


小智 9

在这里a is an Object,但b(null)就是没有一个对象是空引用

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

System.out.println(b instanceof Object); // false
Run Code Online (Sandbox Code Playgroud)

这是我的类似答案


tem*_*def 9

两者之间存在非常显着的差异.空字符串""是"其中没有字符的字符串".它是一个具有明确定义长度的实际字符串.所有标准字符串操作都在空字符串上定义良好 - 您可以将其转换为小写,查找其中某些字符的索引等.空字符串null是"根本没有字符串".它没有长度,因为它根本不是字符串.尝试将任何标准字符串操作应用于空字符串将导致NullPointerException运行时.


Sha*_*fiz 8

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

这里是一个引用一些恰好是空字符串的对象.b没有引用任何对象,因为它为null.


JUS*_*ION 5

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


sid*_*tha 5

""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());
    }
}
Run Code Online (Sandbox Code Playgroud)

}


Muk*_*mar 5

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

String s = null;
s.length();
Run Code Online (Sandbox Code Playgroud)

对空字符串的引用""指向堆中的一个对象 - 因此您可以调用它的方法。

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