Java 我是否应该使用“;";或';c';在处理字符串时是否为单个字符?
一个非常简单的问题。这和性能有关系吗?还有别的吗Java 我是否应该使用“;";或';c';在处理字符串时是否为单个字符?,java,Java,一个非常简单的问题。这和性能有关系吗?还有别的吗 System.out.println('c'); System.out.println("c"); 哪个,为什么 System.out.println("Letter: " + "c"); System.out.println("Letter: " + 'c'); 这是为什么?它们是不同的东西“c”是长度为1的字符串对象'c'是一个char原语值(Java中的整数类型之一) System.out.println("Letter: " + "c
System.out.println('c');
System.out.println("c");
哪个,为什么
System.out.println("Letter: " + "c");
System.out.println("Letter: " + 'c');
这是为什么?它们是不同的东西
“c”
是长度为1的字符串
对象'c'
是一个char
原语值(Java中的整数类型之一)
System.out.println("Letter: " + "c");
System.out.println("Letter: " + 'c');
它们看起来可以互换的部分原因是Java的字符串连接规则;该语言将aString+aChar
定义为将UTF-16值aChar
表示的字符追加到aString
后产生的字符串。在您的特定示例中,表达式“字母:“+‘c’
被视为编译时常量String
表达式,由编译器计算,而不是在运行时。您可以通过编译代码并查看生成的字节码来了解这一点
Java语言规范详细说明了正在发生的事情。首先,其中一条是:
如果只有一个操作数表达式的类型为String
,则在运行时对另一个操作数执行字符串转换()
字符串串联的结果是对两个操作数字符串串联而成的string
对象的引用
然后,我们发现(在其他规则中):
基本类型为T
的值x
首先转换为参考值,就像将其作为适当的类实例创建表达式()的参数一样:
- 如果
是T
,则使用char
新字符(x)
String
因此,理论上,
char
常量'c'
是一个字符
对象。然而,在实践中,编译器和核心类具有很大的自由度,可以生成效率更高(但功能相当)的代码。什么更接近您的意图?对于未来的代码读者来说,什么会更清楚?向字符串添加字符是通过StringBuilder完成的,不会将'c'
变成对象。@TeemuIlmonen-实际上,自动装箱正是理论上正在发生的事情。请参阅我的扩展答案。然而,在实践中,既不使用自动装箱也不使用StringBuilder
;编译器只是将整个表达式视为编译时字符串常量。是的,处理常量时不需要StringBuilder。我猜引用并没有具体说明在声明“as if by”时需要使用什么路径,它只是说明结果必须是什么。切中要害:自动装箱将是Character.valueOf(x)
,而不是newcharacter(x)
?@TeemuIlmonen-是的,我认为自动装箱将使用Character.valueOf(x)
,但在内部,这只会让类有机会返回以前使用new Character(x)构造的缓存Character
对象
;否则,它仍然会以一个新的对象构造结束。