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;
}
}

三. 小结

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

[Java源码解析] -- String类的compareTo(String otherString)方法的源码解析的更多相关文章

  1. 菜鸡的Java笔记 第十三 String 类的两种实例化方法

    String 类的两种实例化方法 String 类的两种实例化方式的区别 String 类对象的比较 Stirng 类对象的使用分析 /*    1.String 类的两种实例化方式的区别       ...

  2. String类原理分析及部分方法

    //String类原理分析及部分方法 //http://www.cnblogs.com/vamei/archive/2013/04/08/3000914.html //http://www.cnblo ...

  3. String类比较,String类运算比较,String运算

    String类比较,String类运算比较 >>>>>>>>>>>>>>>>>>>&g ...

  4. String类有哪些常用的方法

    String类常用方法 1.String类长度:String没有length的属性,有length()这个方法,可以获取字符串的长度. 可以求得字符串s的长度,但是该长度会包含空格. 2.indexO ...

  5. String类的compareTo()方法的源码解析

    private final char value[]; 字符串会自动转换为一个字符数组. public int compareTo(String anotherString) { //this -- ...

  6. String类的compareTo()和compareToIgnoreCase()

    compareTo()的返回值是int,它是先比较对应字符的大小(ASCII码顺序) 1.如果字符串相等返回值0 2.如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值 ...

  7. 关于java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)

    public byte[] getBytes(Charset charset) Encodes this String into a sequence of bytes using the given ...

  8. Unicode与ASCiI之间有什么区别?java当中的转义字符 Character类的使用 String类的使用

    ASCII码 称为 美国标准信息交换码 (American standard code of Information Interchange) 其中一共有多少个码?2的7次幂 128个 Unicode ...

  9. java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二)

    1.自动判断格式并调用相应的转换工具,默认方法 /** * 自动判断格式并调用相应的转换工具,默认方法 * @param srcVideoPath * @param tarVideoPath * @r ...

随机推荐

  1. 前端页面JS和CSS以及图片加载nginx报错:net::ERR_CONTENT_LENGTH_MISMATCH的解决与检查

    首先检查nginx权限 具体可参考地址https://www.cnblogs.com/hooly/p/9951748.html 或者百度其他方法 还有种情况,之前是可以用的,突然出现这种加载报错的情况 ...

  2. install linux on VM

    1. install完成之后,没有UI,可以在安装的向导过程中配置,先点击language,选择英语,然后再software那里 勾选,server with gui->KDE, 一定要在看到的 ...

  3. zookeeper第一篇

    它是一个为分布式应用提供一致性服务的软件, 提供的功能包括:配置维护.域名服务.分布式同步.组服务等.

  4. scrapy 爬取豆瓣互联网图书

    安装scrapy conda install scrapy 生成一个scrapy项目 scrapy startproject douban settings文件 # -*- coding: utf-8 ...

  5. shell 常用案例

    此博文有自己写的其它朋友分享的,其中对其它朋友写的有问题的地方我简单做了一些修改,能保证运行. 1.写一个脚本通过ping命令测试192.168.0151到192.168.0.254之间的所有主机是否 ...

  6. python 列表去重的几种方法

    1 a = [,,,,,,,,,,] a1 = [] for i in a: if i not a1: a1.append(i) else: continue 2 a = [,,,,,,,,,] a1 ...

  7. python测试开发django-1.开始hello world!

    前言 当你想走上测试开发之路,用python开发出一个web页面的时候,需要找一个支持python语言的web框架.django框架有丰富的文档和学习资料,也是非常成熟的web开发框架,想学pytho ...

  8. cnpm install -g live-server 安装服务

    cnpm  install -g live-server     指令会在浏览器自动打开页面

  9. Java集合中List,Set以及Map等集合体系详解

    转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...

  10. CSDN网站阅读更多:实现原理

    一 设计案例 现在很多网站都增加了阅读更多功能.以CSDN为例,分析其实现原理. 二 设计原理 1 内容区的初始高度是固定的. 2 背景渐变的操作区,遮盖在内容区上面 3 点击按钮时,解除内容区的高度 ...