system.out.println()总在末尾加换行,因其设计语义是“输出+换行”,底层使用平台相关行分隔符;空参调用仍输出换行符,而print不换行且光标停在末字符右侧。

System.out.println 为什么总在末尾加换行
因为 println() 的设计语义就是“输出 + 换行”,底层调用的是平台相关的行分隔符(\n 或 \r\n),不是简单拼接一个 \n 字符。这意味着即使你传入空字符串,System.out.println("") 和 System.out.println() 效果一致:都只输出一个换行符。
print 不换行,但光标位置容易被忽略
print() 确实不自动换行,但它也不会主动移动光标到下一行开头——光标就停在上一次输出的最后一个字符右边。这导致后续输出会紧贴着接续,比如:
System.out.print("a");
System.out.print("b");
System.out.print("c");
结果是 abc(单行无空格)。如果中间混入 println(),比如:
System.out.print("x");
System.out.println("y");
System.out.print("z");
结果是:
x y z
注意:第三行的 z 是新行开头,不是接在 y 后面——因为 println("y") 已把光标推到了下一行起始位置。
循环里垂直打印?大概率误用了 println
写嵌套循环打印图案时,常见错误是把 println() 放在内层循环体里,比如想打印一行五个 A,却写了:
for (int i = 0; i <p>正确做法是内层用 <code>print()</code>,外层用 <code>println()</code> 控制行结束:</p> <pre class="brush:php;toolbar:false;">for (int i = 0; i
- 不要指望
print()自动对齐或补空格,它只负责“不换行” - 如果需要格式化(如固定宽度、右对齐),该用
printf(),而不是硬凑print()+ 空格 - 在 IDE 控制台或某些终端里,最后一行没换行可能显示不完整(光标卡在行尾),调试时建议结尾补一个
println()
参数类型和 null 处理其实没区别
print() 和 println() 对参数类型完全一致:都接受任意对象,内部统一调用 String.valueOf(x) 转换。传 null 都输出字符串 "null",传 42 都输出 "42",不存在“print() 只能输字符串”的说法——那是过时资料的误解。
真正影响行为的,只有换行与否这一个开关。其他所有差异,都是这个开关引发的连锁反应:光标位置、日志可读性、与 Scanner 输入的配合、甚至单元测试断言时的字符串匹配(别忘了比对换行符!)。










