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;
    }
相关文章
|
存储 关系型数据库 MySQL
面试时被这样一个问:”存储MD5值应该用VARCHAR还是用CHAR?
一个5年工作经验的小伙伴,在面试的时候被这样一个问题。说”存储MD5值应该用VARCHAR还是用CHAR“,他一时间不只如何选择,感觉用VARCHAR也可以,用CHAR也行。希望我来帮忙分析一下。
120 0
|
4月前
|
存储 数据管理 数据库
|
7月前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
存储 SQL 数据库
char、varchar、nvarchar、text的区别
char、varchar、nvarchar、text的区别
97 0
|
7月前
|
存储 数据库
5. CHAR和VARCHAR的区别?
`CHAR`和`VARCHAR`在数据库中有所不同:`CHAR`长度固定,用空格填充,存储效率高,英文占1字节,汉字占2字节;而`VARCHAR`长度可变,节省空间,英文和汉字都占2字节。
84 0
|
7月前
|
存储 机器学习/深度学习 关系型数据库
mysql中char和varchar的区别
mysql中char和varchar的区别
185 1
|
7月前
|
存储 SQL NoSQL
面试题:char和varchar的区别?
字节面试题:char和varchar的区别?
123 0
|
存储
char和varchar的区别(秒懂!)
char和varchar的区别(秒懂!)
115 0
|
7月前
|
存储 关系型数据库 MySQL
MySQL之varchar和char的区别
MySQL之varchar和char的区别
71 0
|
7月前
|
存储 关系型数据库 MySQL
MySQL 总结char与varchar的区别
MySQL 总结char与varchar的区别
67 0