【问题标题】:What is the difference in converting string buffer to string using .toString(), String.valueOf() and + " "使用 .toString()、String.valueOf() 和 + " " 将字符串缓冲区转换为字符串有什么区别
【发布时间】:2014-09-30 06:01:53
【问题描述】:

以下三种情况下StringBuffer转String的主要区别是什么:

案例 1:使用 toString()

StringBuffer sb = new StringBuffer("Welcome");
String st = sb.toString();

案例 2:使用 + ""

StringBuffer sb = new StringBuffer("Welcome");
String st = sb + "";

案例 3:使用 String.valueOf()

StringBuffer sb = new StringBuffer("Welcome");
String st = String.valueOf(sb);

在性能方面使用哪种最佳做法?

【问题讨论】:

  • 没什么,sb + ""就是调用StringBuffer类的toString方法。

标签: java string stringbuilder


【解决方案1】:

这个

StringBuffer sb = new StringBuffer("Welcome");
String st = sb + "";

或多或少会导致

StringBuffer sb = new StringBuffer("Welcome");
StringBuilder builder = new StringBuilder();
builder.append((sb == null) ? "null" : sb.toString());
builder.append("");
String st = builder.toString();

【讨论】:

  • 是builder.append("");需要在第四行吗??
  • @RajavelD 我认为toString
  • @RajavelD 第一个,但不明显。我只是喜欢它读起来更好的方式。
  • 仅当这不是在循环中完成时;) +1 否则
  • @TheLostMind 因为sb 可能是null 并且编译器(创建该代码)不知道/关心sb 是否为空。 String.valueOf() 通过返回 "null" 处理 null)
【解决方案2】:

如果我们在java中编译成两个方法

private StringBuffer sb = new StringBuffer("Welcome");

public String testToString() {
  return sb.toString();
}

public String testAppend() {
  return sb + "";
}

然后使用javap -v,我们得到

public java.lang.String testToString();
  descriptor: ()Ljava/lang/String;
  flags: ACC_PUBLIC
  Code:
    stack=1, locals=1, args_size=1
       0: aload_0       
       1: getfield      #19                 // Field sb:Ljava/lang/StringBuffer;
       4: invokevirtual #27                 // Method java/lang/StringBuffer.toString:()Ljava/lang/String;
       7: areturn       
    LineNumberTable:
      line 10: 0
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
          0       8     0  this   Lcom/stackoverflow/Question;

public java.lang.String testAppend();
  descriptor: ()Ljava/lang/String;
  flags: ACC_PUBLIC
  Code:
    stack=2, locals=1, args_size=1
       0: new           #31                 // class java/lang/StringBuilder
       3: dup           
       4: invokespecial #33                 // Method java/lang/StringBuilder."<init>":()V
       7: aload_0       
       8: getfield      #19                 // Field sb:Ljava/lang/StringBuffer;
      11: invokevirtual #34                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
      14: invokevirtual #38                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      17: areturn       
    LineNumberTable:
      line 14: 0
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
          0      18     0  this   Lcom/stackoverflow/Question;

因此附加似乎效率稍低,因为它使用了额外的堆栈位并包含更多指令。

【讨论】:

  • 你能告诉我如何使用“javap -v”
  • 它是 JDK 附带的命令行工具。 javap -v myclass.class
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2019-07-30
  • 2019-07-29
相关资源
最近更新 更多