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

一. 前言

  近日研究了一下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;
}
}

三. 小结

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

最新文章

  1. Wind7系统下 wifi设置
  2. 动画制作库tween样例学习
  3. PS1--cannot be loaded because the execution of scripts is disabled on this system
  4. POJ 2429 GCD &amp; LCM Inverse (Pollard rho整数分解+dfs枚举)
  5. linux命令补全 忘记命令只记得开头
  6. HDU-2262 Where is the canteen 概率DP,高斯消元
  7. Number of 1 Bits——LeetCode
  8. JNI加载Native Library 以及 跨线程和Qt通信
  9. Windows 配置JAVA的环境变量
  10. Python基础之列表
  11. 关于表单提交submit的兼容性问题。
  12. struts2教程&amp;实例
  13. mac安装tensorflow
  14. 关于iOS socket的讲解介绍
  15. 使用百度云 BOS 和 C# SDK 开发数据存储
  16. Debian Security Advisory(Debian安全报告) DSA-4416-1 wireshark security update
  17. 第 8 章 容器网络 - 066 - Weave 如何与外网通信?
  18. Java写 插入 选择 冒泡 快排
  19. LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci
  20. Atcoder Yahoo Programming Contest 2019 简要题解

热门文章

  1. 模仿input闪烁光标
  2. c# WinForm 文本输入对话框
  3. css 动态线条制作方案
  4. eclipse invalid zip archive lib
  5. 计算kdj
  6. 《CSAPP》读书笔记
  7. Python 的xlutils模块
  8. mysql表理解
  9. java-27 Properties类的使用
  10. C# Task.Run 和 Task.Factory.StartNew 区别