Java中String.format()和str.formatted()有什么区别?

问题描述 投票:0回答:2

我知道方法 String.format() 与方法 System.out.printf() 几乎相同,只是它返回一个字符串。但我很难找到有关“formatted”方法的介绍,其定义如下:

public String formatted(Object... args) {
        return new Formatter().format(this, args).toString();
}

我知道下面两个代码的功能是相同的。

String str1 = String.format("%s", "abab");
System.out.println(str1);
String str2;
str2 = "%s".formatted("abab");
System.out.println(str2);

因此我想知道它们之间有什么区别。谢谢!

java format formatted
2个回答
24
投票

确保您使用好的 IDE,以便可以轻松浏览 JDK 源代码。在 Eclipse 中,使用 F3 打开任何声明。 IntelliJ IDEA 也有类似的功能。

如果您查看这两个方法的源代码,您可以看到这些调用是相同的,除了在比较实例与静态方法时变量

this
format
互换:

public String formatted(Object... args) {
    return new Formatter().format(this, args).toString();
}
public static String format(String format, Object... args) {
    return new Formatter().format(format, args).toString();
}

正如您所观察到的:

String.format(str, args)
str.formatted(args)

相同

6
投票

文本块已最终确定并永久添加到JDK 15中,并且添加了一些其他方法来支持文本块。其中一种方法是:

String::formatted(Object... args)

我知道下面两个代码的功能是相同的。

正如您在问题中提到的,两种方法都执行相同的工作并且

返回相同的结果。引入这种方法的目标是:

简化文本块中的值替换

基于 JEP(JDK 增强提案)378:

文本块不直接支持字符串插值。未来的 JEP 中可能会考虑插值。与此同时, 新实例方法 String::formatted

 有助于解决以下情况
可能需要插值。

作为示例,您考虑以下代码段:

String code = String.format(""" public void print(%s o) { System.out.println(Objects.toString(o)); } """, type);
我们可以使用格式化方法将其更改为:

String source = """ public void print(%s object) { System.out.println(Objects.toString(object)); } """.formatted(type);
哪个更干净。



使用这些方法时还要考虑它们之间的这些细微差别:

public static String format(String format, Object... args)

    使用
  • 格式字符串参数返回格式化字符串。
  • 这是
  • String 类的 static
     方法。
  • 它在
  • Java SE 5 [自 2004 年起]中引入。

public String formatted(Object... args)

    使用
  • this 字符串作为 格式字符串以及提供的 参数进行格式化。
  • 这是
  • String类的实例
    方法。
  • 它在
  • Java SE 15 (JDK 15) [自 2020 年起]中引入。
  • 这个方法相当于
  • String.format(this, args)
    
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.