Java 基础:string中的compareTo方法
前言:
今天看了一篇gitchat
的文章,标题是 聊聊 Java String
源码的排序算法,从中有所感悟和思考,因此打算总结下自己看的过程中的收获
一,java.lang.Comparable 接口
Comparable
接口强制了实现类对象列表的排序。其排序称为自然顺序,其 compareTo
方法,称为自然比较法
public interface Comparable<T> { public int compareTo(T o); }
如果用this
代表当前调用该compareTo
方法的对象,obj
是方法传入参数
则:
this < obj ---- 返回负数 this = obj ---- 返回 0 this > obj ---- 返回正数
Comparable
接口的compareTo
是一种内比较,即支持跟当前对象比较
二,java.util.Comparator 接口
Comparator
可以认为是是一个外比较器,一个对象不支持自己和自己比较(没有实现Comparable
接口),但是又想对两个对象进行比较
public interface Comparator<T> { int compare(T o1, T o2); //省略........... }
比较逻辑:
o1 < o2 ---- 返回负数 o1 = o2 ---- 返回 0 o1 > o2 ---- 返回正数
三,聊聊string中的compareTo方法
String
中实现的是Comparable
接口来为String
对象作出比较逻辑
public final class String implements java.io.Serializable, Comparable<String>, CharSequence{ //........ }
先看一段示例:
/** * 字符串比较案例 */ public class StringComparisonDemo { public static void main(String[] args) { String foo = "ABC"; // 前面和后面每个字符完全一样,返回 0 String bar01 = "ABC"; System.out.println(foo.compareTo(bar01)); // 前面每个字符完全一样,返回:后面就是字符串长度差 String bar02 = "ABCD"; String bar03 = "ABCDE"; System.out.println(foo.compareTo(bar02)); // -1 (前面相等,foo 长度小 1) System.out.println(foo.compareTo(bar03)); // -2 (前面相等,foo 长度小 2) // 前面每个字符不完全一样,返回:出现不一样的字符 ASCII 差 String bar04 = "ABD"; String bar05 = "aABCD"; System.out.println(foo.compareTo(bar04)); // -1 (foo 的 'C' 字符 ASCII 码值为 67,bar04 的 'D' 字符 ASCII 码值为 68。返回 67 - 68 = -1) System.out.println(foo.compareTo(bar05)); // -32 (foo 的 'A' 字符 ASCII 码值为 65,bar04 的 'a' 字符 ASCII 码值为 97。返回 65 - 97 = -32) String bysocket01 = "泥瓦匠"; String bysocket02 = "瓦匠"; System.out.println(bysocket01.compareTo(bysocket02));// -2049 (泥 和 瓦的 Unicode 差值) } }
结果:
0
-1
-2
-1
-32
-2049
再结合上边示例看看String
中对compareTo
方法的实现
public int compareTo(String anotherString) { //len1:当前字符串长度 int len1 = value.length; //len2:参数字符串长度 int len2 = anotherString.value.length; //len1和len2两者最小值 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]; //字符不同,则返回两字符的ASCII 码的差值 if (c1 != c2) { return c1 - c2; } k++; } //相同则返回两字符长度差值 return len1 - len2; }
所以从上面的源码中可以看到,string
中的compareTo
逻辑大概可以整理为
字符串前面部分的每个字符完全一样,返回:后面两个字符串长度差;
字符串前面部分的每个字符存在不一样,返回:出现不一样的字符 ASCII 码的差值。
字符串的每个字符完全一样,返回 0;
在String内部还有个静态内部类CaseInsensitiveComparator
也实现了该接口
private static class CaseInsensitiveComparator implements Comparator<String>, java.io.Serializable{ //................. }
该重写的接口方法是String
对象的大小写不敏感比较方法
public int compare(String s1, String s2) { int n1 = s1.length(); int n2 = s2.length(); int min = Math.min(n1, n2); for (int i = 0; i < min; i++) { char c1 = s1.charAt(i); char c2 = s2.charAt(i); //转大写 if (c1 != c2) { c1 = Character.toUpperCase(c1); c2 = Character.toUpperCase(c2); //还不一样则转小写 if (c1 != c2) { c1 = Character.toLowerCase(c1); c2 = Character.toLowerCase(c2); //还不一样则:返回不一样字符的ASCII 码的差值。 if (c1 != c2) { // No overflow because of numeric promotion return c1 - c2; } } } } return n1 - n2; }
到此这篇关于Java 基础:string中的compareTo方法的文章就介绍到这了,更多相关string中的compareTo方法内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
原文出处:https://blog.csdn.net/weixin_41922289/article/details/904639
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
mybatis 返回Integer,Double,String等类型的数据操作
这篇文章主要介绍了mybatis 返回Integer,Double,String等类型的数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-25- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29
Java中lombok的@Builder注解的解析与简单使用详解
这篇文章主要介绍了Java中lombok的@Builder注解的解析与简单使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-06