java 里除了 messageformat.format(),常见字符串拼接/模板化方式很多,不同场景适用不同方案。
1.+拼接(最常用)
string s = "姓名:" + name + ",年龄:" + age;
优点:
- 最简单
- 编译器会优化成
stringbuilder - 性能不错
适合:
- 日常开发
- 少量拼接
2.stringbuilder
stringbuilder sb = new stringbuilder();
sb.append("姓名:")
.append(name)
.append(",年龄:")
.append(age);
string s = sb.tostring();
优点:
- 性能高
- 大量循环拼接推荐
适合:
- for 循环
- 高频字符串构建
3.stringbuffer
stringbuffer sb = new stringbuffer();
sb.append("abc");
特点:
- 线程安全(加锁)
- 比
stringbuilder慢
现在用得少。
4.string.format()
类似 c 语言 printf。
string s = string.format(
"姓名:%s,年龄:%d",
name,
age
);
占位符:
| 占位符 | 类型 |
|---|---|
%s | 字符串 |
%d | 整数 |
%f | 浮点 |
%tf | 日期 |
适合:
- 格式化输出
- sql/日志模板
缺点:
- 性能一般
- 国际化不如
messageformat
5.messageformat.format()
messageformat.format(
"姓名:{0},年龄:{1}",
name,
age
);
特点:
- 国际化 i18n 常用
- 支持数字/日期格式
- 支持多语言资源文件
缺点:
- 有 locale 自动格式化
'单引号坑- 阿拉伯语数字本地化问题
6. java 15+ text block(文本块)
适合多行模板。
string s = """
用户:%s
年龄:%d
""".formatted(name, age);
这是现在比较现代的写法。
7..formatted()(java 15+)
本质是 string.format() 简化版。
string s = "姓名:%s,年龄:%d"
.formatted(name, age);
比:
string.format(...)
更简洁。
8.stringjoiner
专门做分隔符拼接。
stringjoiner joiner = new stringjoiner(",");
joiner.add("a");
joiner.add("b");
joiner.add("c");
system.out.println(joiner);
输出:
a,b,c
9.string.join()
string s = string.join(",", "a", "b", "c");
或者:
list<string> list = arrays.aslist("a", "b", "c");
string s = string.join(",", list);
10. stream 拼接
list<string> list = arrays.aslist("a", "b", "c");
string s = list.stream()
.collect(collectors.joining(","));
适合:
- 集合处理
- stream 风格
11. 模板引擎(企业项目常用)
比如:
- thymeleaf
- freemarker
- velocity
- mustache
示例(freemarker):
你好 ${name}适合:
- 邮件模板
- html
- 国际化文案
- 大段文本
12. slf4j 日志占位符(日志推荐)
log.info("用户 {} 登录,ip {}", name, ip);
特点:
- 不会提前拼接
- 性能更好
- 日志推荐
不要写:
log.info("用户:" + name);
企业开发推荐
| 场景 | 推荐 |
|---|---|
| 普通拼接 | + |
| 循环高性能 | stringbuilder |
| 日志 | {} |
| 国际化 i18n | messageformat |
| 多行模板 | """ + .formatted() |
| 集合 join | string.join |
| html/邮件模板 | freemarker/thymeleaf |
你现在这个:阿拉伯语 + i18n + 占位符
最适合的是:
messageformat- 或 icu4j(更专业国际化)
但如果只是简单替换,其实可以直接:
template.replace("{0}", value)
反而更稳定,不会触发 locale 自动数字转换。
以上就是java中常见的字符串拼接/模板化方式详解的详细内容,更多关于java字符串拼接的资料请关注代码网其它相关文章!
发表评论