Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
null和空(“空”)Java字符串之间的差异_Java_String_Null_Equals_Referenceequals - Fatal编程技术网

null和空(“空”)Java字符串之间的差异

null和空(“空”)Java字符串之间的差异,java,string,null,equals,referenceequals,Java,String,Null,Equals,Referenceequals,null和“(空字符串)之间有什么区别 我编写了一些简单的代码: String a = ""; String b = null; System.out.println(a == b); // false System.out.println(a.equals(b)); // false 两个语句都返回false。看起来,我无法找到它们之间的实际区别。这里a是一个对象,但是b(null)不是一个对象,它是一个空引用 System.out.println(a instanceof Object)

null
(空字符串)之间有什么区别

我编写了一些简单的代码:

String a = "";
String b = null;

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

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

这里
a是一个对象
,但是
b(null)
不是一个对象,它是一个空引用

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

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

我的类似答案是字符串是一个对象,可以为空


null表示字符串对象未实例化

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


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

“”是实际字符串,尽管是空字符串

然而,null表示字符串变量不指向任何内容

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

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

区别在于,由于“”是一个实际的字符串,因此您仍然可以像调用

a.length()

a.子字符串(0,1)

等等

如果字符串等于null,比如b,如果您尝试调用,Java将抛出一个
NullPointerException
,比如:

b.length()


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

==比较引用,就像我去

String a = new String("");
String b = new String("");
System.out.println(a==b);
这将输出false,因为我分配了两个不同的对象,a和b指向不同的对象

但是,在这种情况下,
a.equals(b)
将返回true,因为字符串的
equals
将返回true

不过,请注意,Java对字符串确实有一个特例

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

您可能会认为输出是
false
,因为它应该分配两个不同的字符串。实际上,Java将使用文本字符串(在我们的示例中初始化为a和b的字符串)。所以要小心,因为这可能会给==的工作方式带来一些误报。

您的语句告诉您的只是“”与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未引用任何对象,因为它为空

空字符串不同于 中的空引用 面向对象编程语言 对字符串类型的null引用 不指向字符串对象,并且 将导致一个错误,如果尝试 对其执行任何操作。空的 string仍然是一个 可以尝试字符串操作

从维基百科上的文章来看。

null都是不同的。第一个表示作为字符串变量声明的一部分,字符串常量已在字符串池中创建,并且已为其分配了一些内存

但是当我们用null声明它时,它只是被实例化为jvm,但没有为它分配内存。因此,如果您试图通过使用-blank变量检查该对象来访问该对象,则无法防止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());
    }
}
}

对空字符串
的引用指向堆中的对象-因此可以对其调用方法


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

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

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


佐藤()这个概念可以从数学中更好地理解。你有没有试过用计算器(例如7/0)将一个数字(不是零)除以0?您将得到如下结果:
未定义
非数字
等等。这意味着由于某些原因,该操作是不可能的(让我们把这些原因留到另一天讨论)

现在,执行以下操作:0/7。您将获得输出0。T
String s = "";
s.length();

String s = null;
s.length();
System.out.println(a == b); // false. because a and b both points to different object reference

System.out.println(a.equals(b)); // false, because the values at object reference pointed by a and b do not match.

System.out.println(b.equals(a)); // NullPointerException, because b is pointing to unknown reference and no operation is allowed
    String s1 = null;
    String s2 = "hello";

     s1 = s1 + s2;
   

    System.out.println((s); // nullhello
String str1;
String str2 = "";