字符串拼接的几种方式

1、使用 + 完成拼接字符串常量
String str1 = "hello";
String str2 = "world";
String str3 = "hello" + "world";

反编译以后的代码,

String str1 = "hello";
String str2 = "world";
String str3 = (new StringBuilder()).append("hello").append("world").toString();

可以看出,原来字符串常量在拼接过程中,JVM会优化成创建StringBuilder的匿名对象,使用其append方法拼接l

也就是说,Java中的 + 对字符串常量的拼接,其实现原理是使用StringBuilder.append来提高效率。

2、StringBuffer和StringBuilder的append()

StringBuilder类封装了一个字符数组:private char value[];
与String不同的是,它并不是final的,所以他是可以修改的。另外,与String不同,字符数组中不一定所有位置都已经被使用,它有一个实例变量,==int count;==表示数组中已经使用的字符个数

append源码如下:

public StringBuilder append(String str) {
    super.append(str);
    return this;
}

查看其父类AbstractStringBuilder

public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}

append会直接拷贝字符到内部的字符数组中,如果字符数组长度不够,就进行扩容。
StringBuffer和StringBuilder最大的区别在于是线程安全问题。StringBuffer用synchronized修饰保证线程安全,相对效率会差一点。

public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}
3、concat() 方法
String str1 = "hello";
String str2 = "world";
String str3 = str1.cancat("world").

注意:这个方法只能用于拼接字符串,不能拼接其他类型的数据)将指定的字符串拼接到该字符串的末尾。并且字符串本身和拼接的字符串都不能为null,否则运行程序后会报空指针异常NullPointerException。

小结:

字符串拼接过程中会创建新的对象,如果要在一个循环体中进行字符串拼接,就要考虑效率问题。使用StringBuilder的方式是效率最高的,但是存在线程安全问题。如果不是在循环体中进行字符串拼接的话,用 + 就可以。

发布了52 篇原创文章 · 获赞 6 · 访问量 1440

猜你喜欢

转载自blog.csdn.net/qq_40488936/article/details/104921939
今日推荐