String.concat源码
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);
}
字符串用+相加:
简单的一个例子
public void fun39() {
String s = "abc";
String s1 = s + "def";
}
可以看到编译之后,可以看到 + 在java中是通过创建了StringBuilder对象 调用了append两次 将”abc“ 和 ”def“进行拼接
然后调用了toString方法
public fun39()V
@Lorg/junit/Test;()
L0
LINENUMBER 439 L0
LDC "abc"
ASTORE 1
L1
LINENUMBER 440 L1
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
ALOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
LDC "def"
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 2
L2
LINENUMBER 441 L2
RETURN
L3
LOCALVARIABLE this Lcom/zys/demo/StringUtils; L0 L3 0
LOCALVARIABLE s Ljava/lang/String; L1 L3 1
LOCALVARIABLE s1 Ljava/lang/String; L2 L3 2
MAXSTACK = 2
MAXLOCALS = 3
对于很多场景 直接使用 + 会简单很多,但是循环+ 直接使用StringBuilder对于效率会有所提升。