首页 > 编程知识 正文

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

时间:2023-05-04 08:31:25 阅读:285638 作者:4652

    Hello,大家好,我是Steafan,从今天开始呢,会为大家带来在Java中对于String常用方法的源码解析,旨在帮助大家从源码层面理解具体的方法是怎么设计的,以及具体的方式是如何实现的,我们在搞清楚这些知识点后,那么在我们今后的日常工作中会给我们带来很大的帮助,话不多少,直入正题吧!

    首先介绍一下String这个类,String不属于Java的基本类型,而是属于String的引用类型,但是String在实际项目中又经常被用到,所以很多人都会以为String属于Java的基本类型。String类被final关键字修饰,这就说明String类不能被其他类继承,又因为组成字符串的每个字符,即在String类中的value属性是被final关键字修饰的,如下图1,所以String类是不可变类,在多线程场景下,如果对外发布的对象是String类型的,那么线程在访问该对象时就是线程安全的,这就是实现线程安全的一种方式-发布不可变对象。String类实现了java.io.Serializable接口,这就意味着String类是经过序列化的;String类必须实现CharSequence接口,否则无法处理字符串中的每个字符,同样的,字符已无法组成字符串。

                                 

                                                        图一 组成字符串的字符Value

一、toString()方法解析

       首先,toString()方法它不在String这个类中,它属于Java中所有类的父类Object类中的方法。先看一下源码截图,如下图2

     

                                                              图2 Object类中的toString()方法源码截图

      toString()方法相信大家并不陌生,在开发项目时经常会用到该方法将对象类型转换成字符串类型。通过阅读英文注释,不难发现,toString()方法返回一个String类型的字符串,这个字符串由当前位于的类名+@符号+hashcode编码值组成,代表了一个对象转换成String字符串之后的结果。

二、equals()方法解析

      equals()方法也是在项目开发中用到的频率比较高的一个方法,主要用来对比两个属性的值是否相等,源码如图3所示

            

                                                          图3 String类中的equals()方法源码截图

       equals()方法接收一个参数名为anObject的Object类型的参数,返回布尔类型的状态标识,即true和false,显而易见的,true代表两个属性的值相等,相反,false代表两个属性的值不相等。equals()方法会判断传入的对象类型是否是String类型,如果两个对象类型均为String类型,则返回true,反之,返回false;如果传入的对象类型不是String类型,则将其对象类型进行强制转换,将其转换为字符串类型anotherString,在转换成字符串类型之后,equals()方法首先会判断两个对象的值长度是否相等,如果长度不相等,equals()方法返回true,如果长度相等,则递归比较两个值中的字符是否每个都相等,如果其中有一个不相等则equals()方法返回false,否则,返回true。这就是equals()方法分析比较两个对象的值的全部过程。

三、length()方法和isEmpty()方法解析

     length()方法和isEmpty()方法源码如图4所示

      

                                                 图4 String类中的length()方法和isEmpty()方法源码截图

    length()方法不接收任何参数,返回int类型数值。length()方法很容易和Java基本类型中的数组中的length属性相混淆,值得注意的是String中的是length方法,没有length这个属性,而数组中的是length属性,没有length这个方法,这点要理清楚。当调用了length()方法,系统就会计算这个value有几个字符,索引从1开始,而不是从0开始,并最终返回这个value值的字符长度。

    isEmpty()方法不接收任何参数,返回布尔类型的状态标识,即返回true代表值为空,返回false,代表值不为空。当调用isEmpty()方法时,系统会获取到value值的长度,如果值的长度为0,那么isEmpty()方法就会返回true,否则,返回false。

四、indexOf()方法解析

       String类中的indexOf()方法有很多种重载,在这里,我只介绍使用最多的一个,也就是最常用的一个,如图5所示

                 

                                                     图5 String类中的indexOf方法调用方法截图

         indexOf()方法接收一个int类型的ch参数,返回int类型的索引值。String类中常用的indexOf()方法在被调用时,系统会调用另外一个indexOf方法,也就是说,当我们使用indexOf()方法时,实际上使用的不是这个只有一个参数的方法,而是用的如图6所示的indexOf()方法(篇幅问题,在这里我截取了方法位于的代码行数,方便定位)。

       

                                                    图6 String类中真是调用的indexOf()方法源码截图

       indexOf()方法接收int类型的ch参数(我们传递的字符,也可以理解为终点字符)和fromIndex参数(开始计算的索引位置),返回int类型的索引值(从字符串的第一个字符开始计算到ch参数为止的索引值)。indexOf()方法首先会拿到字符串的长度max,然后通过数学归纳法对fromIndex进行判断,如果fromIndex的值小于0,那么就让fromIndex的值等于0,如果fromIndex的值比max的值还要大,那么就返回-1,即代表你要查询的索引值不存在或不合法,如果以上条件判定都通过,那么indexOf()方法会用一个最小值和ch的值进行比较,如果ch的值大于等于那个最小值,那么就返回索引越界异常,否则,indexOf()方法会将当前字符串存储到一个字符数组value中,然后用fromIndex当做边界条件来进行遍历,如果ch的索引值等于遍历的value的值的索引,则将当前索引i进行返回,否则返回-1,意义同上。这就是indexOf()方法进行逻辑判断和比较的整个过程。

       同理的,lastIndexOf()方法的源码实现和上述比较逻辑相反,大家可以试着推理一下。

五、subSequence()方法解析

      subSequence()方法较前面几种方法来说,不是很常用,但是在特定场合下,使用的频率还是很高的,其源码如图7所以

             

                                                  图7 String类中subSequence()方法源码截图

      subSequence()方法接收int类型的beginIndex,endIndex,即开始索引和结束索引,返回经过截取后的CharSequence类型的字符,如果需要使用这个截取后的字符,则需要调用toString()方法,将其转换为字符串使用,否则,其实字符类型,不方便使用。subSequence()方法被调用时直接是将String类中的substring()方法的执行结果进行返回,其subSequence()方法本身并没有什么很复杂的逻辑来进行推理验证,至于substring()方法的实现细节,我会在下一篇博文中进行介绍,感谢朋友们的持续关注!!

     至此,String类中常用方法的解析的第一部分就介绍完毕了,在第一部分,我主要像大家介绍了toString()、equals()方法、 length()方法和isEmpty()方法、indexOf()方法以及推到了lastIndexOf()方法的实现逻辑、subSequence()方法,并在文章最后连接了substring()方法。在下一篇博文中我会接上第一部分,首先介绍substring()方法,然后再挑选几个常用的方法进行介绍,感谢朋友们的持续关注!!

    彩蛋彩蛋彩蛋:本博客中的电商项目数据库获取、后台完整源代码、前台项目完整源代码将在本周之内逐步完成开放,希望小伙伴们可以密切留意此事,遇到问题可以在下放评论留言,我会及时回复,QQ和微信不方便添加,各位请见谅,再次感谢朋友们的持续关注,谢谢!!!!!!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。