在Java中,用null字符替换字符串中的一个字符真的有效吗?我知道'\0'会终止C字符串。
这取决于您如何定义“有效”。它是否将目标字符的所有出现替换为'\0'
? 绝对可以!
String s = "food".replace('o', '\0');
System.out.println(s.indexOf('\0'));
System.out.println(s.indexOf('d'));
System.out.println(s.length());
System.out.println(s.hashCode() == 'f'*31*31*31 + 'd');
我觉得一切都很正常!indexOf
可以找到它,计算长度时也会将其计算在内,它的哈希码计算值为0;这些都符合JLS/API的规定。
但是如果你期望用null字符替换一个字符能从字符串中删除该字符,那么它就不起作用。当然它不会像那样工作。null字符仍然是一个字符!
String s = Character.toString('\0')
System.out.println(s.length())
assert s.charAt(0) == 0
如果你期望使用 null 字符终止一个字符串,那么它也不起作用。这在上面的片段中是显而易见的,但在 JLS (10.9. An Array of Characters is Not a String) 中也明确规定:
在 Java 编程语言中,与 C 不同,char
数组不是 String
,String
和 char
数组都不会以 '\u0000'(NUL 字符)作为终止符。
这是否是出现奇怪字符的罪魁祸首?
现在我们讨论的是完全不同的事情,即字符串在屏幕上的呈现方式。事实上,即使是 "Hello world!" 在使用 dingbats 字体时也会看起来很奇怪。Unicode 字符串在一个区域设置下可能会看起来很奇怪,但在另一个区域设置下却不会。即使包含中文字符的正确渲染的 Unicode 字符串可能对来自格陵兰的人看起来仍然很奇怪。
话虽如此,null 字符可能看起来很奇怪;通常它不是你想要显示的字符。话虽如此,由于 null 字符不是字符串终止符,因此 Java 能够以一种或另一种方式处理它。
现在来解决我们假设的预期效果,即从字符串中删除所有句号,最简单的解决方案是使用 replace(CharSequence, CharSequence)
重载方法。
System.out.println("A.E.I.O.U".replace(".", "")); // AEIOU
这里也提到了replaceAll
解决方案,但它需要使用正则表达式,并且需要转义点元字符,因此很可能速度较慢。