[Java源码解析] -- String类的compareTo(String otherString)方法的源码解析
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)方法的源码解析的更多相关文章
- 菜鸡的Java笔记 第十三 String 类的两种实例化方法
String 类的两种实例化方法 String 类的两种实例化方式的区别 String 类对象的比较 Stirng 类对象的使用分析 /* 1.String 类的两种实例化方式的区别 ...
- String类原理分析及部分方法
//String类原理分析及部分方法 //http://www.cnblogs.com/vamei/archive/2013/04/08/3000914.html //http://www.cnblo ...
- String类比较,String类运算比较,String运算
String类比较,String类运算比较 >>>>>>>>>>>>>>>>>>>&g ...
- String类有哪些常用的方法
String类常用方法 1.String类长度:String没有length的属性,有length()这个方法,可以获取字符串的长度. 可以求得字符串s的长度,但是该长度会包含空格. 2.indexO ...
- String类的compareTo()方法的源码解析
private final char value[]; 字符串会自动转换为一个字符数组. public int compareTo(String anotherString) { //this -- ...
- String类的compareTo()和compareToIgnoreCase()
compareTo()的返回值是int,它是先比较对应字符的大小(ASCII码顺序) 1.如果字符串相等返回值0 2.如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值 ...
- 关于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 ...
- Unicode与ASCiI之间有什么区别?java当中的转义字符 Character类的使用 String类的使用
ASCII码 称为 美国标准信息交换码 (American standard code of Information Interchange) 其中一共有多少个码?2的7次幂 128个 Unicode ...
- java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二)
1.自动判断格式并调用相应的转换工具,默认方法 /** * 自动判断格式并调用相应的转换工具,默认方法 * @param srcVideoPath * @param tarVideoPath * @r ...
随机推荐
- Spring的诞生
前言:不先学习常见的设计模式直接看Spring.MyBatis等源码,简直就是一个找虐的过程!不掌握Servlet原理.基本的Tomcat容器技术上来就看Spring MVC源码同样也是一个打击自信心 ...
- fiddler抓https包
若手机端安装证书后还是无法抓取到https请求,请注意手机端证书开关是否开启: eg:ios 设置---通用---关于本机---证书信任设置:开启证书信任 若还是无法抓包,则可以进行一下操作: 给fi ...
- 移动端目标识别(3)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之Running on mobile with TensorFlow Lite (写的很乱,回头更新一个简洁的版本)
承接移动端目标识别(2) 使用TensorFlow Lite在移动设备上运行 在本节中,我们将向您展示如何使用TensorFlow Lite获得更小的模型,并允许您利用针对移动设备优化 ...
- Django框架的探索
django框架的路由 django2 路由支持正则匹配,如: re_path(r'^category/(?P<category_id>\d+)/$',CourseCategoryView ...
- 【笔记】Python基础一 :变量,控制结构,运算符及数据类型之数字,字符串,列表,元组,字典
一,开发语言介绍 高级语言:Java,C#,Python ==>产生字节码 低级语言:C,汇编 ==>产生机器码 高级语言开发效率高,低级语言运行效率 ...
- Handling Text in Python 相关命令
s.isalpha()意思就是是不是字母,s.isdigit()意思就是是不是0-9,s.isalnum()意思就是是不是由字母和数字组成.
- Hillstone设备管理-恢复出厂设置
1.CLI命令行操作 unset all: 根据提示选择是否保存当前配置y/n: 选择是否重启y/n: 系统重启后即恢复到出厂设置. 2.webUI操作 “系统”—“配置”,点击“清除”按钮,系统会提 ...
- idea配置git,查看git代码&拉取git项目至本地
1.点击file,右键选择setting 选择本地git安装路径 Ps:从git上导入一个全新的maven项目 点击clone按钮后,会弹出如下截图弹窗,点击 NO 项目已经拉取到本地,然后点击ope ...
- checkinstall
一.简介 Linux 的源码安装工具 CheckInstall
- 一个简单地template模板
之前的项目中用到了artTemplate模板,感觉挺有意思,于是查看相关资料,自己动手写了个简单地template模板插件.虽然会有一些不足,但也是自己的一番心血.主体代码如下 /* * 一个简单地t ...