string.format()仅生成字符串不输出,需配合system.out.println()打印;占位符须匹配参数类型,中文环境建议显式传locale.us;printf()直接输出但不换行;日期格式化推荐datetimeformatter;性能敏感场景应避免循环中频繁调用。

用 String.format() 做基础格式化,但别把它当 print 用
它只生成字符串,不输出;想打印得自己加 System.out.println()。常见错误是写成 String.format("hello %s", name); 后发现控制台没反应——因为没调用输出函数。
- 占位符必须和参数类型匹配:
%d对应int,%s对应任意对象(自动调用toString()) - 浮点数默认保留6位小数,要控制精度得写成
%.2f - 中文环境可能因默认 Locale 导致千位分隔符异常,显式传入
Locale.US更稳:String.format(Locale.US, "%.2f", 1234.567) - 参数数量不匹配会抛
IllegalFormatArgumentCountException
printf() 和 format() 的区别:一个输出,一个构造
两者语法完全一致,但 System.out.printf() 直接输出到控制台,String.format() 返回新字符串。选哪个取决于你要不要中间处理。
- 需要拼接日志再统一写入文件?用
String.format() - 只是调试打印?
printf()少写一行更顺手 - 注意
printf()不自动换行,常被忽略导致多条输出挤在一行,建议末尾加\n - 它们都基于
Formatter类,底层共享同一套解析逻辑,行为一致
格式化日期时,SimpleDateFormat 比 String.format() 更合适
String.format() 只支持基本时间单位(如 %tY 年、%tm 月),不能处理时区、本地化星期名、农历等复杂需求。
- 要输出 “2024年04月15日 星期一”,用
SimpleDateFormat:new SimpleDateFormat("yyyy年MM月dd日 E", Locale.CHINA).format(new Date()) -
String.format()的%t系列对Date支持有限,且部分格式符(如%tL毫秒)在不同 JDK 版本表现不稳定 - JDK 8+ 推荐用
DateTimeFormatter配合LocalDateTime,线程安全、功能全、无隐式异常
性能敏感场景下,避免在循环里频繁调用 String.format()
每次调用都会新建 Formatter 实例、解析格式串、分配临时字符数组。高并发或高频日志中容易成为瓶颈。
立即学习“Java免费学习笔记(深入)”;
- 简单拼接优先用
+或StringBuilder,比如"id=" + id + ", name=" + name - 固定格式日志可预编译:用
MessageFormat(注意线程不安全)或java.text.Formattable自定义实现 - Log4j/SLF4J 的占位符(如
log.info("user {} logged in at {}", userId, time))内部做了优化,比直接String.format()快得多 - 字符串常量拼接(如
"hello" + "world")在编译期就合并了,和format完全不是一回事
真正难的不是记住 %s 和 %d,而是判断什么时候不该用它——比如格式化金额要考虑货币符号、舍入模式、负号位置,这时候 NumberFormat 才是正解。










