空和空(“”) Java 字符串之间的区别

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

我写了一些简单的代码:

String a = "";
String b = null;


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

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

509412 次浏览

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

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


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

下面是我类似的回答

字符串是一个对象,可以为空

Null 表示没有实例化 String 对象

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

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

这两者之间有很大的不同。空字符串 ""是“不包含字符的字符串”它是一个具有定义良好的长度的实际字符串。所有的标准字符串运算都在空字符串上定义得很好——你可以把它转换成小写,查找其中某个字符的索引等等。空字符串 null是“根本没有字符串”它没有长度,因为它根本不是字符串。尝试将任何标准字符串操作应用于空字符串将在运行时导致 NullPointerException

是一个真正的“字符串”虽然是个空字符串。

但是,null 意味着 String 变量不指向任何值。

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

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

区别在于,因为“”是一个实际的字符串,所以您仍然可以像这样调用它的方法或函数

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);

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

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

但是要注意的是,Java 对于 String 确实有一个特殊的用例。

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

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

你的陈述告诉你的仅仅是“”不等于“空”——这是真的是空字符串; null 表示没有赋值。

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

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

仍然是一个“字符串”也就是说你可以调用它的方法并获得有意义的信息。Null 是一个空变量-那里什么也没有。

在 Java 中,分配给 null的引用类型具有 毫无价值。分配给 ""的字符串有一个值: 一个空字符串,也就是说一个没有字符的字符串。当一个变量被赋予 null时,它意味着没有任何类型的底层对象,字符串或其他。

Null 表示名称没有引用任何实例化对象。 ""表示一个空字符串。

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

空字符串不同于 中的空引用 面向对象程序设计 对字符串类型的空引用 不指向字符串对象 将导致一个错误,如果一个尝试 对其执行任何操作 字符串仍然是一个字符串 字符串运算。

来自维基百科关于 空字符串的文章。

“强”和“ 无效”都是不同的。第一个意味着作为字符串变量声明的一部分,字符串常量已经在字符串池中创建,并且已经为相同的内存分配了一些内存。

但是当我们用 无效声明它时,它只是被实例化了 jvm,但是没有为它分配任何内存。因此,如果您试图通过使用 ""空白变量检查该对象来访问该对象,则不能防止 nullpointereption。请在下面找到一个用例。

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。然而,如果检查长度,那么它将退出它的循环。

通过这种方式,您还可以理解 null 和空字符串之间的区别:

Difference between null and 0/empty string

原图由 R.Sato 拍摄(@ raysato)

这个概念可以从数学中更好地理解。你有没有试过用计算器(例如7/0)把一个数字(不是0)除以0?你会得到这样的结果: undefinednot a numbernull等等。这意味着由于某些原因,这个操作是不可能的(让我们改天再讨论这些原因)。

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

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

当你写作的时候

String a = "";

这意味着有一个类型为 string 的变量‘ a’,它指向字符串池中的一个对象引用,该对象引用的值为“”。由于变量 a持有有效的字符串对象引用,因此可以在这里应用字符串的所有方法。

而你写作的时候呢

String b = null;

这意味着有一个类型为 string 的变量 b,它指向一个 未知参考。任何对未知引用的操作都将导致 NullPointerException

现在,让我们计算下面的表达式。

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 s=null;

字符串没有初始化为空。如果任何字符串操作尝试它可以抛出空指针异常

String t="null";

它是一个字符串文字,值字符串“ null”与 t = “ xyz”相同。它不会抛出空指针。

String u="";

它是空字符串,不会抛出空指针。

简单来说,

  • 是一个空的“ 绳子

  • Null 是空的 字符串变量

enter image description here

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

图像采自 程序员幽默

空字符串和空字符串之间的区别。例如: 你有一个名为 x 的变量,

var x = "";

这意味着您已经分配了一个空字符串值(长度为0)。事实上,这就像是一件没有任何感觉的事情:)另一方面,

var y = null;

这意味着你没有给 y 赋一个值,这个值在声明的时候写为 null。如果写入 y.length; 它将抛出一个错误,表明没有赋值给 y,因此不能读取 y 的长度。

“我称之为我的十亿美元错误。它是1965年无效引用的发明”-https://en.wikipedia.org/wiki/Tony_Hoare

就现实世界而言,两者都可以假定是一样的。它只是一种编程语言的语法,这种语法在两种语言之间创建了一个差异,这里其他人已经解释过了。这样做只会产生开销,比如在检查/比较 string 变量是否有内容时,首先必须检查它是否为 null,然后再检查实际的字符串比较(即两次比较)。这是对每个字符串比较处理能力的浪费。

Equals ()在调用. equals ()之前检查 null。

作为一种好奇心

    String s1 = null;
String s2 = "hello";


s1 = s1 + s2;
   



System.out.println((s); // nullhello

null没有任何意义; 它意味着您从未为变量设置值,但为空则意味着您已将 ""值设置为 String。例如,请参阅下面的示例:

String str1;
String str2 = "";

这里的 str1null,这意味着您已经定义了它,但是还没有为它设置任何值。但是您已经定义了 str2,并为它设置了一个空值,因此它有一个值,即使该值是 "";

可以将 str1与其他字符串进行比较,但是将 str2与其他字符串进行比较时将抛出 RuntimeException中的 NullPointerException

很棒的答案,但我想从不同的角度给出答案。

String a = "StackOverflow";
String a1 = "StackOverflow" + "";
String a2 = "StackOverflow" + null;


System.out.println(a == a1); // true
System.out.println(a == a2); // false


所以这可以告诉我们“”和 null 指向不同的对象引用。