如何在Java中引用"空字符串"序列?

avg*_*tvs 2 java jvm

在我的整个职业生涯中,我经常看到这样的电话:

if( "".equals(foo) ) { //do stuff };
Run Code Online (Sandbox Code Playgroud)

如何根据Java较低级别的数据理解空字符串?

具体来说,通过"低级Java",我指的是内存的实际内容或用于表示""序列的一些C/C++构造,而不是Java中的高级实现.

我之前已经检查了Java语言规范,它引导我这一点,并注意到"空字符串"并没有真正给出更多的定义,这就是导致头脑搔痒的原因.

然后javap,我尝试通过字节码来尝试通过字节码来解释答案,但是关于"机器如何处理序列的行为""实际上并不是更清楚.然后排除了字节代码和Java代码然后我发布了"这里的问题,希望有人能从较低层面的角度阐明这个问题.

Jon*_*eet 6

没有"空字符串"这样的东西.字符始终是UTF-16代码单元,并且没有"空"代码单元.有一个"空字符串",其表示方式与任何其他字符串完全相同:

  • 一个char[]参考
  • 索引 char[]
  • 一个长度

在这种情况下,长度将是0.char[]参考可能潜在地是一个空字符数组,这可能参考潜在所有实例之间共享String其具有的长度为0.

(代码substring 可以通过检测0长度请求并始终将相同的引用返回到空字符串来实现,但我不知道实现这样做.)

  • 这一切都取决于JVM实现和Java语言并不要求它如何在幕后工作.JVM规范(不同于JLS规范)会提供更多细节,但即便如此,JVM中的确切布局也可能是真的.一种常见且可能的方法是从String对象到char []对象的指针,该对象具有0长度属性而没有元素. (2认同)