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
对象
;否则,它仍然会以一个新的对象构造结束。