当前位置:编程学习 > JAVA >>

在java中,字符串的加法是如何实现的?

当我查看String类的concat函数的源码时,发现字符串连接是这么实现的:
Java代码:
public String concat(String str) {  
    int otherLen = str.length();  
    if (otherLen == 0) {  
        return this;  
    }  
    int len = value.length;  
    char buf[] = Arrays.copyOf(value, len + otherLen);  
    str.getChars(buf, len);  
    return new String(buf, true);  
}  
那么,字符串的连接符(+)的实现和这个有什么区别呢?如果有区别的话,那它是如何实现的呢?
此外,这两者分别在什么场合使用,有没有性能上的差异。
 
为了回答这个问题,我们可以做一个测试。
 
首先,我们连接两个字符串
Java代码:
String s1 = "foo";  
String s2 = "bar";  
String s3 = s1 + s2;  
 
下面我们将这个代码编译成class文件,然后再反编译(可以用JAD),我们得到反编译后的代码是:
Java代码:
String s = "foo";  
String s1 = "bar";  
String s2 = (new StringBuilder()).append(s).append(s1).toString();  
所以,+ 和 concat 肯定是有区别的。
在性能上,从 concat() 源码可以看出,StringBuilder创建了更多的对象,而concat却没有,它使用的String类的内部实现。
综上,当我们需要连接两个字符串的时候,我们应当优先考虑使用 concat() 函数,当我们需要连接字符串和其它类型的变量时,再考虑使用+运算符。
译者注:用 javap -c 查看java生成的字节码:
Java代码:
java.lang.String cat(java.lang.String, java.lang.String);  
  Code:  
   0:   new     #2; //class java/lang/StringBuilder  
   3:   dup  
   4:   invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V  
   7:   aload_1  
   8:   invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;  
   11:  aload_2  
   12:  invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;  
   15:  invokevirtual   #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/    String;  
   18:  astore_1  
   19:  aload_1  
   20:  areturn  
可以看出 a += b 其实等价于
原文来自站长网www.software8.co/
Java代码:
a = new StringBuilder()  
    .append(a)  
    .append(b)  
    .toString();  
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,