java里字符串的连接用加号和用concat()方法有什么不同

2024年11月22日 21:06
有2个网友回答
网友(1):

首先要明白java中字符串的原理:

java中字符串其实是一个char数组,但这个数组是不可变的,所以如果改变字符串内容都会对应的重新创建一个String对象,对应的也就生成了一个新的char数组。

public String concat(String string) {
    if (string.count > 0 && count > 0) {
        char[] buffer = new char[count + string.count];
        System.arraycopy(value, offset, buffer, 0, count);
        System.arraycopy(string.value, string.offset, buffer, count, string.count);
        return new String(0, buffer.length, buffer);
    }
    return count == 0 ? string : this;
}

这是jdk中的concat源码,它保证了重新生成的String对象内部的char数组的长度刚好是字符串长度。

对于使用加号连接,编译完后其实使用的是StringBuilder对象的append方法,它也会在System.arraycopy前进行扩容。

private void enlargeBuffer(int min) {
    int newCount = ((value.length >> 1) + value.length) + 2;
    char[] newData = new char[min > newCount ? min : newCount];
    System.arraycopy(value, 0, newData, 0, count);
    value = newData;
    shared = false;
}

可以看到这个扩容操作后char数组的长度是原长度的3/2倍,这样再调用 append方法如果长度是现有长度的1/2以内,就不用再进行扩容操作,进行提高了append性能,所以使用StringBuilder时设置初始长度是很有必要的。

网友(2):

concat()方法是在尾部添加字符串然后生成一个新的..
+号的话,感觉更加方便,看需求把.