彻底搞懂 Java 中 String 的 "" 与 null
刚接触 Java 开发的小伙伴们,是不是常常对 String 类型里的 "" 和 null 感到困惑呢?这两个看似简单的概念,实际上极具迷惑性,刚学习的时候感觉都懂了,但实际掌握得并不扎实,并没有完全明白其中的奥妙。这篇文章将帮助大家彻底搞懂它们的区别,从此不再混淆。
扎实的基础将助你在以后的开发生涯中少走弯路,更精准地分析 bug 的原因出处。接下来,让我们开启正题:
一、搞懂原理
1. String 是对象类型
在弄清楚 Java 中 String 与基本数据类型的区别之前,首先要明确的是,String 是一个对象类型。
许多初学者在看到 String s = "a"; 这样的语句时,可能会误以为它和 int i = 1; 是相似的,认为它们都属于基本类型。然而,实际情况并非如此。
String s = "a"; 这种写法实际上是 Java 为了方便程序员而提供的一种语法糖。所谓语法糖,简单来说,就是 Java 语言在基本语法基础上添加的一种特殊语法,目的是让代码看起来更简洁、更易读。对于 String 类型的赋值语句,Java 编译器进行了特殊的处理。
为了方便你搞懂 "" 和 null 的区别,暂且你可以理解 String s = "a" 实际上是执行了 String s = String("a");(注意:实际上这俩也是有区别的,但在此不多赘述,以免让问题变得越来越复杂,当下的任务是先搞懂 "" 和 null 的区别)。
2. String 在计算机中的存储方式
清楚了 String 是个对象类型,我们的准备工作就做好了,那么接下来我们还要搞清楚对象在计算机中的存储方式涉及到栈内存和堆内存。
在 String s = "a"; 中,变量 s 是一个对象的引用,存储在栈内存中。它类似于一个指针,指向实际存储字符串数据的地方。
在这个例子中,s 在栈内存中占据一定的空间,存储着一个地址,这个地址将引导我们找到存储字符串 "a" 的位置。
而 "a" 则被存储在堆内存里。
以下是一个简单的内存分配示意图:
这个图很好地表示了
String s = "a";
String s1 = "";
String s2 = null;
这三种情况在栈内存和堆内存的分配方式。
由此我们可以很清楚地明白,实际上如果值为 null 是不分配堆内存的,但是为 "" 虽然是空的,但是还是分配了堆内存,只不过字符串的长度为 0(注意堆内存中是不保存双引号的,我那样写只是为了方便观看)。
二、通俗易懂的解释
接下来我再用更为通俗的说法来让大家更好地理解一下这俩的区别:
(一)String 为 null
把 String 为 null 想象成一个空的快递包裹单号。这个单号(变量)只是一个标记,但它目前没有对应的包裹(字符串对象)。
就好像你在快递系统里有一个单号记录,但实际上还没有东西被打包发货,这个单号没有关联任何实际的物品(字符串内容)。
(二)String 为 ""
就好比有一个已经发货的快递包裹,你收到后打开一看,里面是空的。
这个包裹(字符串对象)是真实存在的,它有自己的包装(对象结构),只是里面没有装东西(没有字符),也就是内容长度为 0。
三、操作和使用上的区别
1. 判断条件区别
如果 String 是 null,这就像你拿着一个不存在包裹的单号去问包裹的重量(调用 length() 等方法),快递站工作人员会告诉你这个单号没有对应的包裹,无法查询重量,这就会导致错误(抛出 NullPointerException)。
而对于空包裹(空字符串 ""),你问它的重量,工作人员会告诉你包裹重量为 0(length() 方法返回 0),因为包裹是真实存在的,只是里面没东西。
2. 字符串拼接区别
当有以下代码:
String a = "";
String b = "hello";
这种情况下,System.out.println(a + b); 打印的结果是:hello。
然而,当有以下代码:
String a = null;
String b = "hello";
这种情况下,System.out.println(a + b); 打印的结果是:nullhello。
当 a 是 null 打印没有报错,反而被打印成 "null" 字符串,有些小伙伴可能还是会比较迷惑,但实际上咱们查看一下 String 的源码就会看到 String 源码里面有这样一段代码:[此处可补充更详细的 String 源码解释,如果有的话]。所以当打印 null 的时候并不会报错,而被处理成 "null" 字符串打印出来了。
至此,聪明的小伙伴们该彻底搞懂了吧。祝你们在程序员的道路上一切顺利!
希望以上内容对你理解 Java 中的 String 类型的 "" 和 null 有所帮助。如果你还有任何疑问,欢迎随时向我咨询。