• 比较方法equals( )、==以及CompareTo


    equals() 方法和==运算符执行的是两个不同的操作。

    equals() 方法比较字符串对象中的字符
    ==运算符比较两个对象引用看它们是否引用相同的实例

    下面的程序说明了两个不同的字符串(String)对象是如何能够包含相同字符的,但同时这些对象引用是不相等的:

    1. String s1 = "Hello World";
    2. String s2 = new String(s1);
    3. System.out.println(s1.equals(s2)); // 输出true
    4. System.out.println(s1 == s2); // 输出false

    变量 s1 指向由“Hello World”创建的字符串实例。s2 所指的的对象是以 s1 作为初始化而创建的,存放地址不同。因此这两个字符串对象的内容是一样,但它们是不同的对象,这就意味着 s1 和 s2 没有指向同一的对象,因此它们是不==的。

    因此,千万不要使用==运算符测试字符串的相等性,以免在程序中出现糟糕的 bug。从表面上看,这种 bug 很像随机产生的间歇性错误
     

    equals() 方法

    String 类中重写了 equals() 方法用于比较两个字符串的内容是否相等

    语法

    public boolean equals(Object anObject)

    参数
    返回值
    如果给定对象与字符串相等,则返回 true;否则返回 false。

    1. public class Test {
    2.     public static void main(String args[]) {
    3.         String Str1 = new String("runoob");
    4.         String Str2 = Str1;
    5.         String Str3 = new String("runoob");
    6.         boolean retVal;
    7.         retVal = Str1.equals( Str2 );
    8.         System.out.println("返回值 = " + retVal );
    9.         retVal = Str1.equals( Str3 );
    10.         System.out.println("返回值 = " + retVal );
    11.     }
    12. }

    以上程序执行结果为:

    返回值 = true
    返回值 = true

    compareTo() 方法


    通常,仅仅知道两个字符串是否相同是不够的。对于排序应用来说,必须知道一个字符串是大于、等于还是小于另一个。一个字符串小于另一个指的是它在字典中先出现。而一个字符串大于另一个指的是它在字典中后出现。字符串(String)的 compareTo() 方法实现了这种功能。

    compareTo() 方法用于按字典顺序比较两个字符串的大小,该比较是基于字符串各个字符的 Unicode 值

    compareTo() 方法的语法格式如下:

    str.compareTo(String otherstr);

    它会按字典顺序将 str 表示的字符序列与 otherstr 参数表示的字符序列进行比较。如果按字典顺序 str 位于 otherster 参数之前,比较结果为一个负整数;如果 str 位于 otherstr 之后,比较结果为一个正整数;如果两个字符串相等,则结果为 0。

    提示:如果两个字符串调用 equals() 方法返回 true,那么调用 compareTo() 方法会返回 0

    实例:

    定义一个接口用来实现两个对象的比较。
    interface CompareObject{
    public int compareTo(Object o); //若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小
    }
    定义一个Circle类,声明redius属性,提供getter和setter方法
    定义一个ComparableCircle类,继承Circle类并且实现CompareObject接口。在ComparableCircle类中给出接口中方法compareTo的实现体,用来比较两个圆的半径大小。
    定义一个测试类InterfaceTest,创建两个ComparableCircle对象,调用compareTo方法比较两个类的半径大小。
    代码如下:

    • 接口CompareObject(定义一个比较方法compareTo):
    1. package com.object_04.interface_05;
    2. public interface CompareObject {
    3. public int compareTo(Object o);
    4. //若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小
    5. }
    • 定义一个Circle类
    1. package com.object_04.interface_05;
    2. //定义一个Circle类
    3. public class Circle {
    4. private double redius; //定义一个半径
    5. public Circle() {
    6. }
    7. public Circle(double redius) {
    8. this.redius = redius;
    9. }
    10. public double getRedius() {
    11. return redius;
    12. }
    13. public void setRedius(double redius) {
    14. this.redius = redius;
    15. }
    16. public int compareTo(Object o) {
    17. System.out.println("半径为:"+redius);
    18. return 0;
    19. }
    20. }
    • 定义一个ComparableCircle类
    • 重写是能否比较成功的重中之重,这里有一个重要的点,就是进行 this.getRedius() 与 ((Circle) o).getRedius() 比较时一定要有返回值,才能在测试类打印时输出对应结果
    1. package com.object_04.interface_05;
    2. //定义一个ComparableCircle类,继承Circle类并且实现CompareObject接口。
    3. // 在ComparableCircle类中给出接口中方法compareTo的实现体,用来比较两个圆的半径大小
    4. public class ComparableCircle extends Circle implements CompareObject {
    5. public ComparableCircle() {
    6. }
    7. public ComparableCircle(double redius) {
    8. super(redius);
    9. }
    10. @Override //重写比较方法
    11. public int compareTo(Object o) {
    12. // 运算符预判
    13. if (o instanceof Circle){
    14. //如果不进行预判出现ClassCastException 类转换异常
    15. // 然后进行比较
    16. if(this.getRedius() == ((Circle) o).getRedius()){
    17. return 0;
    18. }else if(this.getRedius() < ((Circle) o).getRedius()){
    19. return -1;
    20. }else {
    21. return 1;
    22. }
    23. }
    24. return 2;
    25. }
    26. }
    • 测试类
    1. ```java
    2. - package com.object_04.interface_05;
    3. public class InterfaceTest {
    4. public static void main(String[] args) {
    5. CompareObject c1 = new ComparableCircle(10);
    6. // 可以使用多态和本态,优先使用多态(站高望远)
    7. CompareObject c2 = new ComparableCircle(20);
    8. int compRs = c1.compareTo(c2);
    9. System.out.println(compRs);
    10. switch (compRs) {
    11. case 0:
    12. System.out.println("相等");
    13. break;
    14. case 1:
    15. System.out.println("左边大");
    16. break;
    17. case -1:
    18. System.out.println("右边大");
    19. break;
    20. default:
    21. break;
    22. }
    23. }
    24. }

    运行结果:

    在这里插入图片描述

     

  • 相关阅读:
    MySQL-Q&A-异常问题及解决方案(持续更新)
    C++面试:磁盘文件系统、虚拟文件系统与文件缓存
    聊一聊对领域驱动设计中“领域”这个词语的理解与分析方法
    剪枝方法有哪几种?
    C#学习笔记(2)——program building blocks
    淘宝二面:MySQL里有2000万条数据,但是Redis中只存20万的数据,如何保证redis中的数据都是热点数据?
    基于JavaSwing开发排课系统 毕业设计 大作业 课程设计
    mysqlbinlog和binlog2sql的使用及mysql通过binlog日志恢复数据
    Spring boot和Vue.js实现基于oauth2授权码模式的认证 (二)
    软件产品质量如何保障?找对软件测试公司是关键
  • 原文地址:https://blog.csdn.net/clover_oreo/article/details/126173932