Java CompareTo方法使用及详解

本文深入解析了Java中字符串比较方法compareTo和compareToIgnoreCase的工作原理,详细阐述了它们如何按字典顺序比较字符串,特别是在处理数字、英文及中文字符时的特殊规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

compareTo方法有两种:
compareTo(String str) 按字典顺序比较两个字符串。
compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。

compareTo大多数时候用作于排序,相对一般排序而言,用compareTo就够了,不考虑大小写的情况很少。compareTo是按照按字典顺序去比较两个字符串的,一般常用的字符串类型无非3个,阿拉伯数字格式,英文字母格式以及中文格式。其中数字格式的顺序最简单,英文字母格式次之,当然,最复杂的还是我们的国语,在忽略多音字的前提下,有多少个汉字?反正我是不知道了。字典表对汉字的排序规律我也不知道,太复杂,所有只研究了英文字母格式,在第二篇中具体说明。

先把代码和结果放出来:
在这里插入图片描述

排序是根据两个字符串之间的顺序比值来排列的,在此不补充排序方法,只对CompareTo方法解说。
(变量1).<方法>(变量2),返回的值是变量1比变量2的字典顺序。

注意点:
1、 顺序相等,则返回0,变量1的顺序在变量2之前则返回负值数,变量1的顺序在变量2之后则返回正值数。以此比较!
2、 比较的时候,相等则继续比较下一位数,直到有一位数不等,进行比较,但要注意,只会比较一次,以这一次的值作为比较数据;如果两个变量位数相等、顺序一致,则返回零;
3、 如果顺序相等,位数不等,则位数之间相减(多减少),其余规则不变。(如图中的:顺序相等,位数不同的比较)
字典顺序:
1、 阿拉伯数字:阿拉伯数字的顺序很简单,因为阿拉伯数字总体只有10个数字,从0到9。国际通用,顺序就是顺着来的。
2、 英文字母:代码本身就是西方人设计出来的,相对的,对他们的语言的基础(26字母)的编码也就更标准了,本人对26字母的字典顺序还是有一点点的不解。不影响分析。26字母区分大小写,大写字母的顺序排在小写字母之前。按字母顺序排列,大小写字母的顺序之间没有间隔,但在边界有一样的间隔,具体在第二篇讲。有兴趣的同学去查一下,本人有点懒。
3、 中文:中文的格式表示惹不起,具体排列没去查过,但在排序方法中,中文一般不作为比较值(出现的位数是一致的),比较的是数字或者字母为主。你若是作死,那没办法了。换个说法,以中文作为比较去排序没有意义!汉字在字典表中的顺序是非常庞大的,可以用中文去比较,但排序出来的顺序不是你想要的结果(结果未知性),因为字典顺序只比较一次!因此,在用CompareTo方法排序时,一般中文的比较值在各变量中都是相同的(同一个中文)比如都是用员工1,员工2等等,排序用到的是后面的数字;注意一般真正比较的值(位数)不是中文,是数字或者字母这些可以按想要顺序排列的值(位数)

补充说明一下:
在方法使用中(变量1).<方法>(变量2),得到的值是变量1在变量2的字典顺序之前还是之后,决定是正值还是负值,比如在图中的:阿拉伯数字格式,第一位数都是1,就跳过,然后1在9之前,得到的就是负值,1在9前8位,所以返回-8,只比较一次,所以,在比较不等值时只比较一次(上面说过相等就跳过,直到不等的位数进行比较,或者都相等就返回0),因为值比较一次,所以也就排序作用了。也许还能遍历出来所有的比较呢?没试过,有兴趣的童鞋可以尝试。

可以了解规律,实用性不是很高,可以自行判断相差值,排序方法时电脑已经计算好了的,所有更多的是理解作用,先上代码,有点懒,全部结合在一张图了。
在这里插入图片描述
声明一下,不介绍不区分大小写的,不区分后,没啥好说的,个人感觉compareToIgnoreCase就是为了填区分大小写时字典表的顺序问题的,compareTo的字典表顺序整体有点怪怪的感觉。
a与A的比较顺序是32,既是字典顺序中a在A的后32位,反过来比较就是-32.算是字母顺序中的一个中间数。相同的,其余两个也是一样的。
a与Z的比较顺序是7,既是字典顺序中a在Z的后7位,反过来比较就是-7.
z与A的比较顺序是57,既是字典顺序中z在A的后57位,反过来比较就是-57.
a与A的比较顺序是32,在这三个比较值中,算是中间位置,峰值是57,在字典表中,57是最后一个了,当然具体排序不清楚,57只是a在A顺序后57位(大写A在字母顺序中是第一个,小写z是最后一个),a与Z的比较顺序是7,别问我为啥中间空了7位数,我也不知道,理应Z之后下一个字典顺序就是a才对。所以某些时候要比较时有点乱,compareToIgnoreCase就应运而生了,修改字典表太麻烦,但能加呀!有不少方法就是亡羊补牢弄出来的。
虽然不知道字典表的具体排序顺序,但字母表的顺序除了前后有点怪,别的都正常。<z←→B>比较是56,按字母顺序递加,<z←→Y>比较是33, <z←→Z>比较又回到了32,<a←→Z>比较是7,反过来,<a←→Y>比较是8,按字母顺序递减,<a←→B>比较是31,<a←→A>比较是32,又回到了中间值,来来回回就是在26字母之间加减,只是中间多出了一些不存在于字母顺序的位数,不用纠结太多,别像我一样了。
研究了半天。区分大小写的情况下,逃不出57,比较值只会在-57到57之间产生,因为只比较一次,就算比较多次,也就多几个57到57之间的比值而已。区分大小写的话,逃不出25,比较值只会在-25到25之间产生。
还是要注意一下:compareTo的比较是比较不同点(或者说是找区别),并且是只比较一次。之后又多少不同点都不管的。就像是在区分对象,抓住一点不同就好,能区分就行。同等同值时就成了类了,比如都是男生,知道了,返回个零表示没区别。同值位数不等,就像是这一边有3个男生,那一边有1个男生,区别就是个数,就返回2,表示区别。正负值是看这个位数是在比较值之前还是之后,反过来就是了。

### Java 中 `compareTo` 方法使用说明 #### 什么是 `compareTo` 方法? `compareTo` 是 Java 中定义在 `Comparable<T>` 接口中的方法,其目的是提供一种自然顺序的比较方式。任何实现了 `Comparable` 接口的类都需要重写这个方法来指定如何与其他同类对象进行比较。 方法签名为: ```java public int compareTo(T o); ``` 返回值解释如下[^1]: - 如果当前对象小于参数对象,则返回负整数; - 如果两者相等,则返回零; - 如果当前对象大于参数对象,则返回正整数。 --- #### 示例:自定义类中实现 `compareTo` 方法 下面展示了一个简单的例子,在自定义类中实现 `compareTo` 方法: ```java import java.util.Arrays; public class MyClass implements Comparable<MyClass> { private int value; public MyClass(int value) { this.value = value; } @Override public int compareTo(MyClass o) { return Integer.compare(this.value, o.value); // 使用内置工具简化比较逻辑 } @Override public String toString() { return "MyClass{" + "value=" + value + '}'; } public static void main(String[] args) { MyClass obj1 = new MyClass(50); MyClass obj2 = new MyClass(75); System.out.println(obj1.compareTo(obj2)); // 输出 -1 表示 obj1 小于 obj2 System.out.println(obj2.compareTo(obj1)); // 输出 1 表示 obj2 大于 obj1 System.out.println(obj1.compareTo(new MyClass(50))); // 输出 0 表示两者相等 } } ``` 上述代码展示了如何通过 `Integer.compare()` 来简化数值型字段之间的比较过程。 --- #### 基础数据类型封装类中的 `compareTo` 对于基础数据类型的封装类(如 `Integer`, `Long`, `Float`, 和 `BigDecimal`),它们已经默认实现了 `Comparable` 接口并提供了自己的 `compareTo` 方法。 ##### 1. `BigDecimal` 的 `compareTo` 方法 以下是关于 `BigDecimal` 类的一个简单实例演示: ```java import java.math.BigDecimal; public class BigDecimalExample { public static void main(String[] args) { BigDecimal num1 = new BigDecimal("123.45"); BigDecimal num2 = new BigDecimal("123.45"); System.out.println(num1.compareTo(num2)); // 返回 0,表示两者的值相等 } } ``` 注意:即使两个 `BigDecimal` 对象的小数位长度不同,只要它们的实际数值一致,就会被判定为相等[^2]。 ##### 2. `Long` 的 `compareTo` 方法 下面是针对 `Long` 数据类型的对比操作: ```java public class LongCompareToExample { public static void main(String[] args) { Long ob1 = 10L; Long ob2 = 20L; int compare = ob1.compareTo(ob2); System.out.println("ob1.compareTo(ob2):" + compare); // 输出 -1 } } ``` 这里可以看到标准库函数的应用情况[^3]。 ##### 3. `Double` 的 `compareTo` 方法 同样适用于浮点数的情况也可以这样处理: ```java public class DoubleCompareToExample { public static void main(String[] args) { Double d1 = 1.5; Double d2 = 1.5; System.out.println(d1.compareTo(d2)); // 输出 0 } } ``` 这表明即使是双精度实数也能利用同样的机制完成排序需求[^5]。 --- ### 总结 综上所述,无论是用户自定义的数据结构还是基本数据类型的包装器都可以借助 `compareTo` 函数达成有效的次序排列目的。这种设计模式不仅增强了程序内部的一致性和可读性,同时也让集合框架能够自动支持基于键值关系的操作行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值