2020-03-12-String的拼接

2020-03-12  本文已影响0人  耿望

String

在java中我们很喜欢用“+”来拼接两个字符串,但是实际上“+”拼接后是产生了一个新的String对象,它的实现原理是一个StringBuilder。比如下面的代码,两次的str其实是两个对象。

String str = "a";
str = str + "b";

其实还有一种方法,就是使用String自己定义的concat方法。从源码上看,是将两个string进行了char数组的拼接,返回了一个新的String对象。

    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);
    }
    void getChars(char dst[], int dstBegin) {
        System.arraycopy(value, 0, dst, dstBegin, value.length);
    }

另外,字符串拼接常用的两个类是StringBuilder和StringBuffer,他们都继承了AbstractStringBuilder。并且它们的append方法最终都是调用super方法实现的,但是我们可以看到StringBuffer是线程安全的,因为append方法是一个同步方法。

StringBuilder

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

StringBuffer

    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }

最后,在它们的父类,append方法是一个char数组拼接的过程。

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;
    }
上一篇下一篇

猜你喜欢

热点阅读