Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java String.format()vs"+&引用;操作人员_Java_String_Concatenation_String Concatenation - Fatal编程技术网

Java String.format()vs"+&引用;操作人员

Java String.format()vs"+&引用;操作人员,java,string,concatenation,string-concatenation,Java,String,Concatenation,String Concatenation,基本字符串连接操作应该使用什么 String randomString = "hello " + userName + " how are you" ? 或 我觉得String.format()可以更好地理解输出字符串。 但是,使用其中任何一种方法,实际的利弊是什么呢 字符串文字池中是否存在性能或孤立项方面的问题 编辑:我指的是字符串中的多个参数,而不仅仅是一个。大约5+ 奖金问题:请在 究竟应该使用哪一种?其中任何一个或第三个 基本字符串连接操作应该使用什么 String randomStr

基本字符串连接操作应该使用什么

String randomString = "hello " + userName + " how are you" ?

我觉得
String.format()
可以更好地理解输出字符串。 但是,使用其中任何一种方法,实际的利弊是什么呢

字符串文字池中是否存在性能或孤立项方面的问题

编辑:我指的是字符串中的多个参数,而不仅仅是一个。大约5+

奖金问题:请在 究竟应该使用哪一种?其中任何一个或第三个

基本字符串连接操作应该使用什么

String randomString = "hello " + userName + " how are you" ?
您提供的示例有不同的用途
+
重载为concat
String
s,但
String。format
用于格式化字符串,如名称所示

将字符串连接在一起不是它的主要工作

因此,如果要求只是连接,请使用
+
或方法

这些链接将非常有用:


就个人而言,我更喜欢使用格式,因为它看起来更好,而且我无法想象它会严重影响性能。

如果您只考虑性能,我相信使用
StringBuilder/StringBuffer
是构建字符串的最有效方法。即使Java编译器足够聪明,可以将大多数字符串连接转换为等效的
StringBuilder

如果您想了解可读性,
String.format
这一点我认为更清晰,除非我需要依赖高性能,否则我也会使用这一点

因此,如果您主要关心的不是性能,这意味着此代码不在一个称为lot的路径中,那么您可能更喜欢使用
String.format
,因为它可以更好地了解结果字符串(如您所说)

此外,使用
String.format
可以使用格式,这意味着您可以使用它填充字符串、格式化数字、日期等,如果使用简单的连接,这将使代码更加糟糕

为Chuu编辑

使用,您可以看到以下代码:

public class Test {
    public static void main(String[] args) {
        String str = "a" + "b" + "c";
        String str2 = "foo" + str + "bar" + str;
        System.out.println(str2);
    }
}
反编译时,将如下所示:

public class Test {
    public static void main(String[] args) {
        String str = "abc";
        String str2 = new StringBuilder("foo").append(str).append("bar").append(str).toString();
        System.out.println(str2);
    }
}
也可以使用
javap
实用程序找到这方面的证明,该实用程序将在
.class
文件下显示Java字节码:

public static void main(java.lang.String[] args);
    0  ldc <String "abc"> [16]
    2  astore_1 [str]
    3  new java.lang.StringBuilder [18]
    6  dup
    7  ldc <String "foo"> [20]
    9  invokespecial java.lang.StringBuilder(java.lang.String) [22]
   12  aload_1 [str]
   13  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
   16  ldc <String "bar"> [29]
   18  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
   21  aload_1 [str]
   22  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
   25  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [31]
   28  astore_2 [str2]
   29  getstatic java.lang.System.out : java.io.PrintStream [35]
   32  aload_2 [str2]
   33  invokevirtual java.io.PrintStream.println(java.lang.String) : void [41]
   36  return
publicstaticvoidmain(java.lang.String[]args);
0最不发达国家[16]
2 astore_1[str]
3新java.lang.StringBuilder[18]
6次重复
7最不发达国家[20]
9调用特殊的java.lang.StringBuilder(java.lang.String)[22]
12 aload_1[str]
13 invokevirtual java.lang.StringBuilder.append(java.lang.String):java.lang.StringBuilder[25]
16最不发达国家[29]
18 invokevirtual java.lang.StringBuilder.append(java.lang.String):java.lang.StringBuilder[25]
21 aload_1[str]
22 invokevirtual java.lang.StringBuilder.append(java.lang.String):java.lang.StringBuilder[25]
25 invokevirtual java.lang.StringBuilder.toString():java.lang.String[31]
28 astore_2[str2]
29 getstatic java.lang.System.out:java.io.PrintStream[35]
32 aload_2[str2]
33 invokevirtual java.io.PrintStream.println(java.lang.String):void[41]
36返回

大多数推荐使用StringBuffer的人都生活在过去。 当前的最佳实践是使用StringBuilder。但是这可能会改变,所以为什么不让编译器为您这样做呢? 当您只使用“+”时,编译器将选择besst当前实现,它甚至可以组合静态字符串(“foo”+“bar”将变成单个“foobar”)

我将显式分配StringBuilder的唯一位置是在循环中(在循环之前创建并在循环中使用)

如果对发生的情况有疑问,请检查生成的字节码

那么什么时候使用格式呢?当实际的格式非常复杂时,我会使用格式。但是您现在谈论的是简单的连接。

试试这个

    long t0 = System.currentTimeMillis();
        String userName = "test";
        for (int i = 0; i < 1000000; i++) {
            String randomString = "hello " + userName + " how are you?";
//          String randomString = String.format("hello %s how are you ?",userName);
        }
        System.out.println(System.currentTimeMillis() - t0);
long t0=System.currentTimeMillis();
字符串userName=“test”;
对于(int i=0;i<1000000;i++){
String randomString=“你好”+用户名+“你好吗?”;
//String randomString=String.format(“你好%s,你好吗?”,用户名);
}
System.out.println(System.currentTimeMillis()-t0);

您会惊讶地发现concatation比String.format快10倍。但是format可以对数字、日期等做很多非常有用的事情。有关详细信息,请参阅java.util.Formatter API,它实际上由String.format使用。

我认为String.format更有效,因为它有以下优点

  • 提高可读性
  • 更好的可译性
  • 您可以在格式字符串中使用格式提供程序和简单格式指示符(如固定宽度)
  • 您可以通过在配置文件中放入格式字符串来完成一些功能强大的事情
  • String.Format()通常更快,因为它在幕后使用了StringBuilder和高效的状态机,而.Net中的字符串连接相对较慢。当字符串的大小和替换值的数量增加时,情况尤其如此

  • 谢谢。

    我的两分钱:始终使用
    String.format()

    在这种情况下,国际化比风格或表现更令人担忧。因此,我总是使用
    String.format()

    英文文本:
    “你好”+用户名+“你好吗?”

    翻译成绝地武士:
    userName+“你好吗?你好!”


    如果字符串是串联的,那么对翻译人员来说,改变词序即使不是不可能,也是很困难的。这个问题变得越来越严重,因为字符串中有更多的片段和更多的占位符。

    在我看来,请使用
    +运算符

    如果性能是一个问题,您应该使用
    StringBuilde
    
        String var = "huge success.";
    
        System.out.print( "I'm making a note here: " + var );
        //System.out.print( "Printing: " + ); Syntax error!
    
        System.out.print( String.format( "I'm making a note here: '%s'", var ) );
        System.out.print( String.format( "I'm making a note here: '%s'" ) ); // runtime exception!
        System.out.print( String.format( "I'm making a note here: '%d'", var ) ); // runtime exception!