String concat(String str) 连接str到当前字符串的末尾
String s1 = “Hello”;
s1.concat(“ World”);
sout(s1);====》Hello
s1 = s1.concat(“ World”);
sout(s1);=====>Hello World
好奇心的引导之下看了一下concat方法的实现,源码是这样的:
public String concat(String str) {
int otherLen = str.length();//取得str字符串长度
if (otherLen == 0) {//如果传入的字符串内容为空,则返回原字符串
return this;
}
int len = value.length;//取得原字符串内容的长度
char buf[] = Arrays.copyOf(value, len + otherLen);//复制字符串的内容到char数组,并扩展长度
str.getChars(buf, len);//将str的内容复制到buf数组中,位置从len开始。在这一步完成两个字符串的拼接
return new String(buf, true);//将buf数组转化为新的String实例并返回
}
在刚开始看的时候会发现其中有两个比较陌生的方法:Arrays.copyOf(Char[] original,int newLength)
和 getChars(char dst[],int dstBegin)
再来看下源码:
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
void getChars(char dst[], int dstBegin) {
System.arraycopy(value, 0, dst, dstBegin, value.length);
}
关于上面两个方法的作用,我在第一段代码的注释中应该写的比较清楚了。
看了这两段代码之后,会发现,它们使用了同一个方法:
System.arraycopy(Object src, int srcPos,Object dest, int destPos,int length);
源码奉上:
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
这里并没有方法体,那是因为该方法有一个关键字修饰:native。
了解这个关键字的朋友应该知道,这代表着该方法是原生态编辑的。也就是说实现它的方法放在了其他语言
编写的文件中。
arraycopy方法的作用是:
将src复制到dest中,src的起始位置为srcPos,dest的起始位置为destPos,复制的长度为length;
到此,学习结束