Java中String类的常用方法源码解析(二)

  Hello,大家好,我是Steafan,这周的工作有点忙,没来得急更新博文,今天还差不多,所以就赶紧捉住本周的尾巴来更新博文了。今天为大家带来Java中对String类的常用方法源码解析的第二篇,同时也是最后一篇。在上篇博文中,我们首先对String类中很常用的几个方法进行了源码分析,他们分别是:toString()方法、equals()方法、length()方法、isEmpty()方法、indexOf()方法以及 subSequence()方法。今天继续为大家解析剩余的常用方法,话不多说,直入正题吧。

  六、substring()方法解析

        说到substring()方法,最令我好奇的是substring()方法的命名并没有遵循官方定义的驼峰桥命名方法。其源码如图8所示:

                Java中String类的常用方法源码解析(二)

                                                         图8 String类中substring()方法源码截图

substring()方法接收int类型的beginIndex和endIndex,返回经过这两个索引值截取过后的新的String对象,也就是返回经截取后的字符串。当substring()方法被调用时,会判断beginIndex是否小于零,如果其索引小于零则抛出字符串索引越界异常;接着会判断endIndex的索引值,即结束时的索引,如果其大于字符串的长度,也会抛出字符串索引越界异常;如果上述检测都通过,那么Java编译器会用一个subLen的变量来储存结束索引和开始索引的差值,如果这个差值小于零,就会抛出字符串索引越界异常,否则就会调用String()构造方法并传入value值以及开始和结束索引来生成新的String对象,也就是新的字符串。

  七、replace()方法解析

        replace()方法源码截图如图9所示:

                    Java中String类的常用方法源码解析(二)

      replace方法接收char类型的oldChar和newChar字符,返回被截取过后的新的String对象,也就是新的字符串。当replace方法被调用时,JVM首先会判断传递过来的新旧字符是否相等,如果两个字符是相等的,那么就不做任何处理直接返回this;如果新旧两个字符不相等,replace方法会定义一个非空标识i,并通过while循环来迭代被替换的字符,直到将字符串的长度都迭代完毕为止。

八、replaceAll()方法解析

      replaceAll方法源码截图如图9所示:

Java中String类的常用方法源码解析(二)

    replaceAll方法接收String类型的regex和replacement参数,返回被替换之后的新的String对象,即新的字符串。注意,这里的regex不是我们传入的需要被替换的字符串,而是一个正则表达式,后面的replacement则是被替换的字符串,这是一个坑,值得大家注意一下。

   当我们接收通过replace或replaceAll方法返回的结果时,我们应该通过定义局部变量的方式来接收,否则,其他方式都是接收不到任何结果的,在idea编译器中会提示这两个方法是isIgnored()的(被忽视的),如下示例图1所示:

         Java中String类的常用方法源码解析(二)

这个replaceStr是可以接收到的,相反,如果你把replaceStr定义为成员变量,replace方法则将会被忽视,如下示例图2所示:

                                Java中String类的常用方法源码解析(二)

     好了,写到这里,笔者对String类自己认为用的较多的方法逐一进行了源码层面的解析,希望能帮到大家。有很多人问我,说String这个类有什么好解析的,应该学习像JUC啊,Integer啊这些所谓“流行”的类的解析,对此,我只能说不积跬步无以至千里,你所说的这些流行的类其实都是基于在你看到的所谓不起眼的类中的简单的实现思路来实现的,我们要从最基础的地方开始,一步一步地慢慢成长,才能纵向提升自我,每一栋高楼大厦都是一块砖一块砖的从最底层开始垒起,其中任何一块砖除了问题都有可能影响整栋大厦的建设,更有可能会直接使大厦被摧毁。

    由于笔者水平有限,博文内容中间可能会有表达错误或不合规范的地方,还望各位业内人士批评指正。

    最后,感谢每一位关注我的朋友,你们的鼓励是我写博文最大的动力,感谢你们每一个人!!!