java源码解析之String类的compareTo(String otherString)方法
作者:dremeue 时间:2023-11-11 23:10:00
一. 前言
最近我发现了一个事情,那就是在面试笔试中,好多公司都喜欢在String字符串上出问题,涉及到方方面面的知识,包括其中的一些常用方法。
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 firstLength - lastLength;
}
}
三. 小结
通过源码的学习, 让我有一种知其然知其所以然的感觉, 后期会继续分享更多源码分析, 与大家共同学习 !
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
来源:https://www.cnblogs.com/fengzongming/p/9045105.html
标签:java,string,compareto方法
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Jetpack Compose常用组件详细介绍
2022-10-16 19:42:58
![](https://img.aspxhome.com/file/2023/4/90134_0s.png)
springboot2.0和springcloud Finchley版项目搭建(包含eureka,gateWay,Freign,Hystrix)
2021-09-14 22:57:38
![](https://img.aspxhome.com/file/2023/0/125640_0s.png)
C#调用微信接口的相关代码
2022-01-23 03:01:02
利用C#守护Python进程的方法
2023-01-05 13:25:56
Java+MySQL 图书管理系统
2023-11-28 19:28:43
![](https://img.aspxhome.com/file/2023/7/60757_0s.png)
C++实现优先队列的示例详解
2022-04-06 22:14:20
![](https://img.aspxhome.com/file/2023/3/122573_0s.png)
SpringBoot Security安装配置及Thymeleaf整合
2023-11-27 16:18:41
Java 1.8使用数组实现循环队列
2022-02-11 04:00:10
Android Toast实现全屏显示
2023-12-22 09:16:05
详解SpringBoot下文件上传与下载的实现
2021-08-15 15:44:13
SpringMVC记录我遇到的坑_AOP注解无效,切面不执行的解决
2021-08-09 06:20:58
Automapper实现自动映射的实例代码
2023-08-14 16:37:10
MyBatis框架之mybatis逆向工程自动生成代码
2023-01-11 06:19:18
![](https://img.aspxhome.com/file/2023/8/88578_0s.jpg)
Android语音识别技术详解及实例代码
2022-09-23 03:46:33
![](https://img.aspxhome.com/file/2023/6/99796_0s.jpg)
Kotlin四大组件中的broadcast广播
2023-07-08 00:44:08
![](https://img.aspxhome.com/file/2023/4/104684_0s.gif)
Java处理Webp图片格式转换的示例代码
2022-03-09 06:27:29
C++详细讲解继承与虚继承实现
2022-10-25 18:33:49
![](https://img.aspxhome.com/file/2023/3/120813_0s.png)
Spring BeanFactory和FactoryBean有哪些区别
2023-06-25 07:42:09
Java基于socket实现的客户端和服务端通信功能完整实例
2023-11-22 12:12:13
![](https://img.aspxhome.com/file/2023/0/85440_0s.png)
使用Java实现qq邮箱发送邮件
2023-10-14 18:24:36
![](https://img.aspxhome.com/file/2023/1/58561_0s.jpg)