java源码解析之String类的compareTo(String otherString)方法
一.前言
最近我发现了一个事情,那就是在面试笔试中,好多公司都喜欢在String字符串上出问题,涉及到方方面面的知识,包括其中的一些常用方法。
String类代表字符串。Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为String对象是不可变的,所以可以共享。
近日研究了一下String类的一些方法,通过查看源码,对一些常用的方法也有了更透彻的认识,也让我更加理解了设计者的算法思想.
我也推荐大家多读读源码,我相信大家也会有意想不到的收获.
二.实战
今天我分析的是String类的compareTo(StringotherString)方法,
以下是我个人的分析观点,如有哪里分析不到位的地方,欢迎大家指出,相互学习,共同进步!
首先,尊重原作者,先放上源码
publicintcompareTo(StringanotherString){
intlen1=value.length;
intlen2=anotherString.value.length;
intlim=Math.min(len1,len2);
charv1[]=value;
charv2[]=anotherString.value;
intk=0;
while(k
下面的是我自己写的山寨compareTo()方法,经测试,结果与compareTo(StringotherString)返回一致
说明:
1.为避免冲突,我定义的方法名为compares
2.注释中已经详细地记录了分析思路,故对代码不做过多说明
publicclassStringDemo{
@Test
publicvoidtest(){
//因为o的ASCII码为:111
//因为a的ASCII码为:97
//所以差为:111-97=14
//返回值为:14,与compareTo返回结果一致
System.out.println(compares("hellojava","hellajava"));
}
publicstaticintcompares(StringfirstString,StringlastString){
/*
*算法思路分析:
*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个字符串的长度,并把最短的字符串长度作为循环的次数(这样可以避免数组越界的异常)
*/
intfirstLength=firstCh.length;
intlastLength=lastCh.length;
intlim=Math.min(firstLength,lastLength);
//用k记录比较的索引
intk=0;
while(k
三.小结
通过源码的学习,让我有一种知其然知其所以然的感觉,后期会继续分享更多源码分析,与大家共同学习!
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。