gpt4 book ai didi

java - 更新字符串的有效方法是什么?

转载 作者:搜寻专家 更新时间:2023-11-01 02:22:01 24 4
gpt4 key购买 nike

假设我需要初始化一个 String 然后再更新它几次,就像在这个伪代码中一样:

String s = "first";
if (<some condition>) { s += "second"; }
if (<some condition>) { s += "third"; }
if (<some condition>) { s += "fourth"; }

如果我最多有大约 4 次,那么以这种方式使用它还是简单地使用 StringBuffer/StringBuilder 更好?

实际上我要问的是,如果 String(可变类型)的哪个更新时间是使用上述选项的有效方式?

最佳答案

首先,String 不是可变类。每次使用 += 时,都会返回另一个对象。

其次,除非你在一个紧密的循环中使用它,否则它并不是很重要。

第三,虽然它可能不是一种类似计算机科学的方法,但如果我尝试使用

    StringBuilder s = new StringBuilder("first");
s.append( "second" );
s.append( "third" );
s.append( "fourth" );

Intellij 建议将其替换为字符串,并且该建议仅在使用简单字符串至少同样有效时才会出现(尽管由于条件的原因可能不完全相同)

根据 Java: String concat vs StringBuilder - optimised, so what should I do?Java 编译器确实用字符串构建器替换了一系列字符串连接:

public static void main(String[] args) {
String s = "first";

s+=" second" ;
if(args.length >0)
s+=" third";

System.out.println("s, = " + s);
}

使用 JDK 1.8.0_66 并使用 javap -c SbTest.class 生成以下输出。虽然我不是字节码方面的专家,但似乎创建了多个 StringBuilder 实例(328)。因此,正如链接答案中所建议的那样,编译后的代码似乎是这样的:

    String s = "first";
s = new StringBuilder().append(s).append(" second") ;
if(args.length >0)
s = new StringBuilder().append(s).append(" third") ;

因此,除非 JIT 对此进行优化,否则您自己使用 StringBuilder 可能仍然更有效。

 public static void main(java.lang.String[]);
Code:
0: ldc #2 // String first
2: astore_1
3: new #3 // class java/lang/StringBuilder
6: dup
7: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
10: aload_1
11: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: ldc #6 // String second
16: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
23: aload_0
24: arraylength
25: ifle 48
28: new #3 // class java/lang/StringBuilder
31: dup
32: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
35: aload_1
36: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
39: ldc #8 // String third
41: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
44: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
47: astore_1
48: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream;
51: new #3 // class java/lang/StringBuilder
54: dup
55: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
58: ldc #10 // String s, =
60: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
63: aload_1
64: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
67: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
70: invokevirtual #11 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
73: return

关于java - 更新字符串的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38134175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com