为什么新的String("")编译而char c =''没有?

blu*_*sky 53 java

为什么空字符串有效且空字符不是?我原以为空字符串不是字符串而是占位符.对于char来说相同,但是创建一个空char甚至不能编译.

我想知道为什么会发生以下情况 - 编译 -

String s = "";
Run Code Online (Sandbox Code Playgroud)

不编译 -

char c = '';
Run Code Online (Sandbox Code Playgroud)

Mar*_*tos 118

因为char代表单个字符,而''不是.字符串可以包含零个或多个字符,但字符不能是单个字符以外的任何字符.

  • @Andrew:字符0是一个字符.具体来说,它被称为"NUL"或"\ 0". (12认同)
  • 是的,这就像设置一个整数...没有. (8认同)
  • @ AndrewJ.Brehm:当然,语言设计师本来可以说'''相当于''\ 0'`,但是他们选择不这样做,可能是因为这会导致一些小而稳定的SO问题沿着,"在Java中,什么意思?" (2认同)

Ste*_*n C 34

因为字符串文字表示可能由零个或多个字符组成的字符串,但是(有效)字符文字只表示一个字符.


char可以定义为可以存储0或1个字符的数据类型...

是.从理论上讲,它可以用这种方式定义.但请相信我,如果你仔细考虑所有问题(例如你如何代表一个空的char,应用程序将如何处理它等等),你会得出结论,这些好处很少,而且有很大的缺点.

无论如何,这样做仅仅是为了使String和char文字之间存在语法一致性将是完全疯狂的.您不会破坏语言的性能和/或语义,因此语法看起来不错.


对接受的答案的一个评论提出''应该意味着相同'\0'.但对此的反驳论点'\0'并不意味着没有人物.它表示一个值为零的字符.所以如果'' 实际上意味着一个字符就会产生误导.而且因为已经有一种方法可以表明这一点...... '\0'第二种表示它的方式是多余的.

如果某些新语言语法既误导又多余,则很难证明添加它.

在处理SoloBold的评论时,虽然可以定义一个字符类型来做到这一点,但它需要更多的空间.至少1位,更可能是16位,以避免尴尬的内存对齐问题.32位char类型是不可接受的......即使它确实解决了其他问题.


hak*_*kon 13

"" 是一个空数组的字符.

'' 根本不是一个角色.


Fle*_*exo 8

空字符串就像一个什么都没有的容器.A char必须具有值且没有一个字符,否则无法从中获取该值.


kap*_*pex 5

您可以将String视为一系列字符.拥有一个没有字符的空序列是有道理的,拥有一个不是字符的字符则不然.

也永远不会使用String s = new String("");,就String s = ""足够了.