阅读String源码收获3

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() 主要用于将两个字符串连接到一个新的字节数组,但没有考虑到编码问题。

以下是更详细的解释:

  1. 字符串编码问题:Java中的字符串可以使用不同的编码方式表示,例如UTF-16、UTF-8等。如果您尝试连接两个不同编码的字符串,那么连接后的结果可能会包含不正确的字符或乱码,因为编码方式不匹配。

  2. 示例代码:在提供的代码中,首先检查了两个字符串的编码是否相同(通过 coder() 方法)。如果它们的编码相同,它就直接将字节数组合并,并创建一个新的字符串。这种情况下,System.arraycopy() 用于将字节数组合并。

  3. 问题:问题在于,如果编码不同,代码并没有正确处理编码问题。在这种情况下,它会简单地将两个字符串的字节数组连接到一起,而不考虑编码转换。

  4. 正确的做法:如果您要连接两个不同编码的字符串,应该先将它们的内容转换为相同的编码,然后再连接。这可以通过以下步骤实现:

    • 使用 getBytes() 方法将字符串转换为指定编码的字节数组。
    • 使用 StringBuilder 或其他字符串拼接方法将两个字节数组连接起来。
    • 最后,将连接后的字节数组转换回字符串,如果需要的话,指定合适的编码。

下面是一个示例,演示了如何连接两个不同编码的字符串并正确处理编码问题:

String str1 = "Hello"; //假设编码为UTF-16
String str2 = new String("World".getBytes("UTF-8"), "UTF-16"); 


String result = str1 + str2; 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值