java源码解析之String类的compareTo(String otherString)方法

 更新时间:2018年09月10日 14:10:28   作者:dremeue  
这篇文章主要给大家介绍了关于java源码解析之String类的compareTo(String otherString)方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧

一. 前言

最近我发现了一个事情,那就是在面试笔试中,好多公司都喜欢在String字符串上出问题,涉及到方方面面的知识,包括其中的一些常用方法。

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

近日研究了一下String类的一些方法, 通过查看源码, 对一些常用的方法也有了更透彻的认识, 也让我更加理解了设计者的算法思想.

我也推荐大家多读读源码, 我相信大家也会有意想不到的收获.

二. 实战

今天我分析的是String类的compareTo(String otherString)方法,

以下是我个人的分析观点, 如有哪里分析不到位的地方, 欢迎大家指出, 相互学习, 共同进步 !

首先, 尊重原作者, 先放上源码

public int compareTo(String anotherString) {
 int len1 = value.length;
 int len2 = anotherString.value.length;
 int lim = Math.min(len1, len2);
 char v1[] = value;
 char v2[] = anotherString.value;

 int k = 0;
 while (k < lim) {
  char c1 = v1[k];
  char c2 = v2[k];
  if (c1 != c2) {
  return c1 - c2;
  }
  k++;
 }
 return len1 - len2;
 }

下面的是我自己写的山寨compareTo()方法, 经测试, 结果与compareTo(String otherString)返回一致

说明:

1. 为避免冲突, 我定义的方法名为compares

2. 注释中已经详细地记录了分析思路, 故对代码不做过多说明

public class StringDemo {
 
 @Test
 public void test() {
 
 // 因为o的ASCII码为: 111
 // 因为a的ASCII码为: 97
 // 所以差为 : 111 - 97 = 14
 // 返回值为:14, 与compareTo返回结果一致
 System.out.println(compares("hellojava", "hellajava"));
 }
 
 public static int compares(String firstString, String lastString) {
  /*
  * 算法思路分析: 
  * 1. 获取2个字符串, 首先把2个字符串都转化为字符数组 (为后面一个一个字符进行比较做铺垫)
  * 2. 获取2个字符串的长度, 并把最短的字符串长度作为循环的次数 (这样可以避免数组越界的异常)
  * 3. 把2个字符串从0开始遍历, 比较每一个字符, 若字符不相等时, 则返回两个字符串的差值
  * 4. 如果遍历的字符串都相等时, 则返回两个字符串的长度差
  * 
  * 方法结果: 
  * 1. 若两个字符串长度和字符都相等时, 则返回0
  * 2. 若两个字符长度不相等, 但大串完全包含(顺序和字符都相等)小串字符时, 则返回两个字符串的长度的差值
  *  举例: 
  *  大串: helloworlds
  *  小串: helloworld
  *  因为大串完全包含小串, 所以返回长度的差值, 为1
  * 3. 若两个字符串长度和字符都不相等时, 则返回比较过程中, 某个索引位置上的字符之差
  *  举例: 
  *  串1: hellojavas
  *  串2: hellajava
  *  遍历比较后, 索引4的字符不同, 所以返回两个字符的差值14, 'o' - 'a' = 14
  */
  
  /*
  * 1. 获取2个字符串, 首先把2个字符串都转化为字符数组 (为后面一个一个字符进行比较做铺垫)
  */
  char[] firstCh = firstString.toCharArray();
  char[] lastCh = lastString.toCharArray();
  
  /*
  * 2. 获取2个字符串的长度, 并把最短的字符串长度作为循环的次数 (这样可以避免数组越界的异常)
  */
  int firstLength = firstCh.length;
  int lastLength = lastCh.length;
  int lim = Math.min(firstLength, lastLength);
  
  // 用k记录比较的索引
  int k = 0;
  while(k < lim) {
  char c1 = firstCh[k];
  char c2 = lastCh[k];
  
  // 3. 把2个字符串从0开始遍历, 比较每一个字符, 若字符不相等时, 则返回两个字符串的差值
  if(c1 != c2) {
   return c1 - c2;
  }
  
  // 如果字符相等, 则让索引加1
  k++;
  }
  
  // 4. 如果遍历的字符串都相等时, 则返回两个字符串的长度差
  return firstLength - lastLength;
 }
}

三. 小结

通过源码的学习, 让我有一种知其然知其所以然的感觉, 后期会继续分享更多源码分析, 与大家共同学习 !

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • java中url汉字编码互相转换实例

    java中url汉字编码互相转换实例

    这篇文章介绍了java中url汉字编码互相转换实例,有需要的朋友可以参考一下
    2013-10-10
  • 解决idea无法导入识别本地类的问题

    解决idea无法导入识别本地类的问题

    今天做实验不知道按了哪里不能导入识别本地的类,只有jar包的类,百度搜索也没有找到合理的解决方案,经过朋友援助问题根源找到,下面小编把解决方法分享给大家,需要的朋友参考下吧
    2021-08-08
  • Java调用echarts提供的地图压缩方法来压缩地图

    Java调用echarts提供的地图压缩方法来压缩地图

    今天小编就为大家分享一篇关于Java调用echarts提供的地图压缩方法来压缩地图,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘

    MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘

    这篇文章主要介绍了MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 使用Java实现简单的区块链程序的方法

    使用Java实现简单的区块链程序的方法

    这篇文章主要介绍了使用Java实现简单的区块链程序的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • java语言中封装类代码示例

    java语言中封装类代码示例

    这篇文章主要介绍了java语言中封装类,涉及相关代码示例及结果分析,以及封装的好处简单介绍,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 利用Java实现带GUI的气泡诗词特效

    利用Java实现带GUI的气泡诗词特效

    这篇文章主要为大家介绍了如何利用Java语言实现带GUI的气泡诗词特效,文中的示例代码讲解详细,对我们学习Java有一定帮助,感兴趣的可以了解一下
    2022-08-08
  • Java把list分成多个list的方法示例

    Java把list分成多个list的方法示例

    在编程中将大的list集合拆分为多个小集合可以提高处理效率,主要拆分方法包括等量拆分适用于均匀处理数据、 指定数量拆分按固定子集大小划分、根据条件拆分按特定规则进行,这些方法有助于多线程异步处理,需要的朋友可以参考下
    2024-11-11
  • 剑指Offer之Java算法习题精讲二叉树专题篇上

    剑指Offer之Java算法习题精讲二叉树专题篇上

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • Java递归算法详解(动力节点整理)

    Java递归算法详解(动力节点整理)

    Java递归算法是基于Java语言实现的递归算法。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。接下来通过本文给大家介绍Java递归算法相关知识,感兴趣的朋友一起学习吧
    2017-03-03

最新评论