Java中System.out.println输出char值为何需前置空字符串
Java随机车牌生成代码空字符串作用解析
示例代码
以下是实现随机车牌生成功能的Java代码:
int letter1 = 65 + (int) (Math.random() * (90 - 65)); int letter2 = 65 + (int) (Math.random() * (90 - 65)); int letter3 = 65 + (int) (Math.random() * (90 - 65)); int number1 = (int) (Math.random() * 10); int number2 = (int) (Math.random() * 10); int number3 = (int) (Math.random() * 10); int number4 = (int) (Math.random() * 10); System.out.println("" + (char)letter1 + (char)letter2 + (char)letter3 + "-" + number1 + number2 + number3 + number4);
核心疑问
调试代码时发现以下现象:
- 移除
println参数开头的空字符串""后,强转为char类型的letter变量不会输出对应英文字母,而是返回整数数值 - 保留开头的空字符串后,变量才能正确输出随机大写字母
- 不清楚空字符串影响
char类型输出结果的底层逻辑
底层原理
这个现象本质是Java+运算符的重载规则+左结合运算特性共同导致的:
+运算符的两套逻辑- 当运算符两侧都是数值类型(含
char、int、short等基本数值类型)时,执行算术加法运算,运算结果为数值 - 只要运算符任意一侧是
String类型,就执行字符串拼接运算,会自动将另一侧的值转为字符串后再拼接,运算结果为字符串
- 当运算符两侧都是数值类型(含
- 左结合的运算顺序
Java中+是左结合运算符,会严格从左到右依次计算相邻两个操作数的结果,再把结果带入下一轮运算:- 移除开头空字符串时,最左侧的运算为
(char)letter1 + (char)letter2,两侧都是char类型,直接执行算术加法,得到两个字符ASCII码相加的int结果;后续运算中这个int值继续和下一个char做算术加法,直到遇到字符串"-"时才开始字符串拼接,最终前面三个字符的ASCII码求和结果会以整数形式输出 - 保留开头空字符串时,最左侧的运算为
"" + (char)letter1,一侧是字符串,直接执行字符串拼接,得到包含对应字母的字符串结果;后续所有+运算的左侧都是字符串类型,全程走字符串拼接逻辑,char类型会自动转为对应字符、数字会自动转成文本形式,最终就能输出符合预期的车牌格式
- 移除开头空字符串时,最左侧的运算为
可以用极简示例验证这个逻辑:
// 无开头空串:先算'A'+'B'=65+66=131,再拼接"-1234",最终输出131-1234 System.out.println((char)65 + (char)66 + "-1234"); // 有开头空串:从第一步就走字符串拼接,最终输出AB-1234 System.out.println("" + (char)65 + (char)66 + "-1234");
内容的提问来源于stack exchange,提问作者Sunghoon Joo
相关产品推荐
相关产品推荐

