public String concat(String str)有一些可以学习的点
源码:
//concat
public String concat(String str) {
if (str.isEmpty()) {
return this;
}
//如果字符串编码相同的话
if (coder() == str.coder()) {
byte[] val = this.value;
byte[] oval = str.value;
int len = val.length + oval.length;
byte[] buf = Arrays.copyOf(val, len);
//这里直接合并了两个数组
System.arraycopy(oval, 0, buf, val.length, oval.length);
//生成新的字符串
return new String(buf, coder);
}
//编码不相同
int len = length();
int olen = str.length();
byte[] buf = StringUTF16.newBytesFor(len + olen);
getBytes(buf, 0, UTF16);
str.getBytes(buf, len, UTF16);
return new String(buf, UTF16);
}
分析:
//这里用两个字符串的数组形式进行拼接
//那有有个疑问?
//既然是连接字符串,为啥不直接用StringBuilder,而是非要用数组,最后再将数组进行合并,
//合并的数组还要最后再转换成字符???
//当编码不相同是没有用数组进行合并,而是用的getBytes()那这是为啥呢?
//看下面这段代码,
//当两个字符串的编码相同时,才进行如下操作
if (coder() == str.coder()) {
//这里用两个字符串的数组形式进行拼接
//那有有个疑问?
//既然是连接字符串,为啥不直接用StringBuilder,而是非要用数组,最后再将数组进行合并,
//合并的数组还要最后再转换成字符???
byte[] val = this.value;
byte[] oval = str.value;
int len = val.length + oval.length;
//这里直接合并了两个数组
System.arraycopy(oval, 0, buf, val.length, oval.length);
//生成新的字符串
return new String(buf, coder);
}
//编码不相同
int len = length();
int olen = str.length();
//当编码不相同是没有用数组进行合并,而是用的getBytes()那这是为啥呢?
byte[] buf = StringUTF16.newBytesFor(len + olen);
getBytes(buf, 0, UTF16);
str.getBytes(buf, len, UTF16);
return new String(buf, UTF16);
结论:
当在Java中连接两个不同编码的字符串时,需要确保字符串的编码在连接时得到正确的处理,以避免乱码或不正确的结果。在您提供的代码中,System.arraycopy()
主要用于将两个字符串连接到一个新的字节数组,但没有考虑到编码问题。
以下是更详细的解释:
-
字符串编码问题:Java中的字符串可以使用不同的编码方式表示,例如UTF-16、UTF-8等。如果您尝试连接两个不同编码的字符串,那么连接后的结果可能会包含不正确的字符或乱码,因为编码方式不匹配。
-
示例代码:在提供的代码中,首先检查了两个字符串的编码是否相同(通过
coder()
方法)。如果它们的编码相同,它就直接将字节数组合并,并创建一个新的字符串。这种情况下,System.arraycopy()
用于将字节数组合并。 -
问题:问题在于,如果编码不同,代码并没有正确处理编码问题。在这种情况下,它会简单地将两个字符串的字节数组连接到一起,而不考虑编码转换。
-
正确的做法:如果您要连接两个不同编码的字符串,应该先将它们的内容转换为相同的编码,然后再连接。这可以通过以下步骤实现:
- 使用
getBytes()
方法将字符串转换为指定编码的字节数组。 - 使用
StringBuilder
或其他字符串拼接方法将两个字节数组连接起来。 - 最后,将连接后的字节数组转换回字符串,如果需要的话,指定合适的编码。
- 使用
下面是一个示例,演示了如何连接两个不同编码的字符串并正确处理编码问题:
String str1 = "Hello"; //假设编码为UTF-16
String str2 = new String("World".getBytes("UTF-8"), "UTF-16");
String result = str1 + str2;