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

网友投稿 257 2023-01-22


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

一. 前言

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

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 fiaCoauqsvxrstLength - lastLength;

}

}

三. 小结

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

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于http接口管理工具的信息
下一篇:Spring Boot 与DBunit 配合使用方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~