首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.toString()、String.valueOf()和+“”将字符串缓冲区转换为字符串有什么区别?

使用.toString()、String.valueOf()和+“”将字符串缓冲区转换为字符串有什么区别?
EN

Stack Overflow用户
提问于 2014-08-07 05:46:48
回答 2查看 5.1K关注 0票数 10

对于以下三种情况,将StringBuffer转换为String的主要区别是什么:

案例1:使用toString()

代码语言:javascript
复制
StringBuffer sb = new StringBuffer("Welcome");
String st = sb.toString();

案例2:使用+ "“

代码语言:javascript
复制
StringBuffer sb = new StringBuffer("Welcome");
String st = sb + "";

案例3:使用String.valueOf()

代码语言:javascript
复制
StringBuffer sb = new StringBuffer("Welcome");
String st = String.valueOf(sb);

在性能方面,哪一种是最佳实践?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-07 05:48:22

代码语言:javascript
复制
StringBuffer sb = new StringBuffer("Welcome");
String st = sb + "";

会或多或少地导致

代码语言:javascript
复制
StringBuffer sb = new StringBuffer("Welcome");
StringBuilder builder = new StringBuilder();
builder.append((sb == null) ? "null" : sb.toString());
builder.append("");
String st = builder.toString();
票数 9
EN

Stack Overflow用户

发布于 2014-08-07 05:55:48

如果我们将它们编译成java中的两个方法

代码语言:javascript
复制
private StringBuffer sb = new StringBuffer("Welcome");

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

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

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

代码语言:javascript
复制
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;

因此,由于它使用了额外的堆栈位,并且包含了更多的指令,因此附加的效率似乎略低一些。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25175001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档