java中printf和string.format共用formatter语法,%d、%s、%f等占位符通用;%lf冗余,double必须用%f;修饰符顺序为标志→宽度→精度→转换符;二者不支持动态参数数量,复杂场景应选messageformat或模板引擎。

Java里printf和String.format用的是一套占位符
它们共享同一套格式语法,底层都走java.util.Formatter。别记两套,记一套就够——比如%d是整数、%s是字符串、%f是浮点数,所有地方通用。
常见错误是把C语言的%lf照搬过来——Java里double一律用%f,用%lf不会报错但属于冗余,且容易误导自己以为类型不同。
-
%d:只接受byte/short/int/long及其包装类,传float或String直接抛IllegalFormatConversionException -
%s最宽容,任何对象都会调用toString(),但null会变成字符串"null",不是空指针异常 -
%tF这类日期格式必须配java.time.temporal.TemporalAccessor(如LocalDateTime),传Date会触发隐式转换,但new Date()本身不推荐用了
宽度、精度、对齐这些修饰符怎么加才不翻车
占位符不是光写%s就完事,%-10s左对齐占10字符、%.5s截前5个字符、%08d补零到8位——这些修饰符顺序不能乱:标志 → 宽度 → 精度 → 转换符。
典型翻车现场:%5.2f合法,%.2f5非法;%-08d中-和0冲突,0被忽略,实际就是左对齐+最小宽度8;%10.3f对double有效,但对int用%10.3d会报错——整数不支持精度修饰。
- 宽度为负(如
%-10s)= 左对齐;默认右对齐,想居中得自己拼空格 - 精度对字符串是最大长度,对浮点数是小数位数,对整数无效
- 用
%,d可加千位分隔符,但区域设置(Locale)影响结果,中文环境默认不用逗号,得显式传Locale.US
printf输出到控制台 vs String.format生成字符串,差别在哪
System.out.printf(...)是直接输出,不返回值;String.format(...)返回格式化后的String,不打印。别指望printf能赋值给变量,也别在日志里用printf——它不走日志框架,没法关、没法改级别、没法异步。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
性能上,String.format每次都会新建Formatter实例,高频场景(比如循环里)建议用new Formatter(new StringBuilder()).format(...).toString()复用,或者直接用MessageFormat(支持占位符重用,但语法不同)。
-
printf底层调用的是PrintStream.format,如果输出流关闭了(比如System.out被重定向后关闭),会抛NullPointerException -
String.format遇到null参数,对%s返回"null",对%d等直接炸,不给你容错机会 - 二者都不支持运行时动态占位符数量,参数个数必须严格匹配,少一个或多个都会抛
MissingFormatArgumentException或TooManyArgumentsException
替代方案:什么时候该放弃printf和String.format
当需求超出简单插值——比如需要条件占位、复数变化、多语言翻译、嵌套对象展开,硬塞%s只会让代码越来越脆。
例如:用户消息“你有%d条未读消息”要适配英文“you have %d unread message(s)”,String.format做不到自动切换单复数;再比如JSON字段名带点号(user.profile.name),想按路径取值,就得换StringSubstitutor(Apache Commons Text)或模板引擎。
- 简单日志拼接优先用SLF4J的
logger.info("msg: {}, code: {}", msg, code),延迟格式化,不拼串不浪费 - 需要类型安全或编译期检查,用
java.text.MessageFormat(注意单引号要转义) - 大量模板渲染(邮件、HTML),别手写
format,用Thymeleaf或Mustache,哪怕只是轻量级的StrSubstitutor
占位符看着简单,但一旦开始加条件、套逻辑、跨语言,就不再是格式化问题,而是数据呈现问题——这时候工具选错,后面全是债。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










