开发者社区> 山月风成> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

replace(char oldChar, char newChar)源码分析

简介: 一String中的replace(char oldChar, char newChar)源码 以下是JRE中源码,分析在第二部分,将全面分析这个方法。
+关注继续查看

一String中的replace(char oldChar, char newChar)源码

  • 以下是JRE中源码,分析在第二部分,将全面分析这个方法。每一行都有注解。

    public String replace(char oldChar, char newChar) {
        if (oldChar != newChar) {
            int len = value.length;
            int i = -1;
            char[] val = value; /* avoid getfield opcode */

            while (++i < len) {
                if (val[i] == oldChar) {
                    break;
                }
            }
            if (i < len) {
                char buf[] = new char[len];
                for (int j = 0; j < i; j++) {
                    buf[j] = val[j];
                }
                while (i < len) {
                    char c = val[i];
                    buf[i] = (c == oldChar) ? newChar : c;
                    i++;
                }
                return new String(buf, true);
            }
        }
        return this;
    }

二源码解释和分析

   //源码分析,这个是String的替代字符的方法
   //例如: s:"hi"  s.replace('h','g') --》s:"gi"
   //oldChar 前者是希望被替换的字符 newChar 后者是希望被替换成的字符
    public String replace(char oldChar, char newChar) {

        //当oldChar和newChar不同时,才替换,不然没有意义
        if (oldChar != newChar) {

            //value是String的私有字符常量 value[]的引用名
            //private final char value[];
            int len = value.length;
            int i = -1;

            //因为value是不可变常量,需要重新创建一个char[] 用以构建新的String
            char[] val = value; /* avoid getfield opcode */

            //i初始值-1 ++i 先加后进行逻辑运算,这个时候 0 1 2 ...只要小于
            while (++i < len) {
                if (val[i] == oldChar) {

                    //break的作用是跳出当前循环块(for、while、do while)或程序块(switch)
                    //如果出现了原来String的oldChar的位置,直接跳出循环
                    //以“hi”为例,s.replace('h','g')
                    //val[0]  == ‘h’
                    // ‘h’ == ‘h’--》 true跳出循环,此时i=0 逻辑的目的是为了定位旧字符的位置
                    break;
                }
            }
            //以“hi”为例,s.replace('h','g')
            //此时i=0  开始进行替换
            if (i < len) {

                //先创建一个新的字符数组,长度与原String相同。
                char buf[] = new char[len];

                //以“hi”为例,s.replace('h','g') 这部分不循环
                //这段循环是在找到原String的第一个需要被替代的字符后,将前面部分的字符,直接循环赋值给新char buf[]
                //这个新的字符数组buf[],新创建的String就是基于这个buf[]来创建的。
                for (int j = 0; j < i; j++) {
                    buf[j] = val[j];
                }

                // 以“hi”为例,s.replace('h','g') i=0,1 len=2 循环下去
                while (i < len) {

                    //将定位到的旧字符附给 c,目的是c == oldChar进行逻辑判断,区分newChar和不需要替换的字符
                    char c = val[i];
                    //找到旧字符用新的字符替换掉
                    buf[i] = (c == oldChar) ? newChar : c;
                    //i++,可以知道的是,将字符串的每一个字符串都进行了逻辑判断。
                    i++;
                }
                //最后得到了一个新的字符数组buf[i]  是这种格式的['g','i']
                //String底层是基于字符数组实现的,用buf[i]实例化一个新的String。
                return new String(buf, true);

                //逻辑为什么是这样,这是源码工程师的尊严和高度
            }
        }
        return this;
    }

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
在SAP C4C创建销售订单时如何绑定创建者的微信open id
在SAP C4C创建销售订单时如何绑定创建者的微信open id
39 0
open a BP will trigger text load - COM_TEXT_MAINTAIN - READ_TEXT
open a BP will trigger text load - COM_TEXT_MAINTAIN - READ_TEXT
28 0
Yarn源码分析之参数mapreduce.job.reduce.slowstart.completedmaps介绍
        mapreduce.job.reduce.slowstart.completedmaps是MapReduce编程模型中的一个参数,这个参数的含义是,当Map Task完成的比例达到该值后才会为Reduce Task申请资源,默认是0.
1204 0
Eclipse 如何查看jdk源码
作者:jiankunking 出处:http://blog.csdn.net/jiankunking 1、首先,在安装jdk的时候要安装源码,或许你没注意到,其实源码就在我们的jdk安装目录下面。(安装的时候是可以选择源码安装路径的,如果选择了其他路径就不会在jdk下面了,默认是在jdk下面的。) 2、打开eclipse,点 “window”-> “Pref
1595 0
I.MX6 Kernel BUG at include/linux/netdevice.h:520!
/*************************************************************************** * I.MX6 Kernel BUG at include/linux/netdevice.h:520! * 声明: * 导致这个问题的原因是对应网卡控制器上的phy已经被移除。
1329 0
flex + spring + BlazeDS + google App JDO 实现一个CRUD.
flex + spring + BlazeDS + google App JDO 实现一个CRUD.   分页在上一个 博客讲了   如何做一个分页.现在要在这个分页上面在做一个CURUD.   列表页面    form页面.表单.  删除页面,可以删除单个和多个. 查询页面.支持分页查询.   最重要的是分页列表里面.删除一个后.要刷新数据. 调用.outerD
1014 0
+关注
山月风成
君子不以辞尽人,故天下有道,则行有枝叶;天下无道,则辞有枝叶。热爱技术岗位,因为这里单纯友好,自由和分享。
37
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载