Java中的比较

目录

一、Java中比较的分类

二、基本类型的比较

一、==运算符

三、引用类型的比较

一、equals运算符

二、基于Comparable接口类的比较

 三、自己定义比较器,实现Comparator接口

四、总结对比三种比较 

一、Java中比较的分类

在Java中,我们一般分为两种比较类型, 基本类型的比较和引用类型的比较

二、基本类型的比较

Java有八大基本类型 分别是:

  1. 整型 : byte  short int  long
  2. 浮点型: float double
  3. 字符型: char
  4. 布尔类型:boolean

java中对于基本类型的比较通常使用比较运算符 == 进行比较   ==比较基本类型是比较值是否相等,比较引用类型是比较==两边的地址是否相等

一、==运算符

        public static void main(String[] args) {
            int a=6;
            int b=6;
            System.out.println(a==b);
    
            String s=new String("hello world");
            String p=new String("hello world");
            System.out.println(s==p);
    
            String d="hello world";
            String f="hello world";
            System.out.println(d==f);
        }

由上图我们发现中间的结果为false ,这是因为new会新在堆中开辟一个地址,导致两个地址不一样;

最后的结果是ture 因为d在使用完后会存入常量池中,f再使用的时候会先在常量池中寻找,寻找到了就直接使用常量池中的地址

 三、引用类型的比较

一、equals运算符

equals()方法只能用来比较两个对象的地址是否相同,子类中往往重写了该方法,用于判断类容是否相同,比如Integer、String等

class Animal{
        public int age;
        public String name;

        public Animal(int age,String name){
            this.age=age;
            this.name=name;
        }
}
public class Main {
    public static void main(String[] args) {
        Animal dog=new Animal(3,"qiuqiu");
        Animal cat=new Animal(3,"qiuqiu");
        System.out.println(dog.equals(cat));
    }
}

我们接下来将代码进行覆写 

import java.util.Objects;

class Animal{
        public int age;
        public String name;

        public Animal(int age,String name){
            this.age=age;
            this.name=name;
        }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Animal animal = (Animal) o;
        return age == animal.age && Objects.equals(name, animal.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}


public class Main {
    public static void main(String[] args) {
        Animal dog=new Animal(3,"qiuqiu");
        Animal cat=new Animal(3,"qiuqiu");
        System.out.println(dog.equals(cat));
    }
}

 

二、基于Comparable接口类的比较

我们接下来实现Comparable接口,重写CompareTo方法

import java.util.Comparator;
import java.util.Objects;

class Animal implements Comparable<Animal> {
        public int age;
        public String name;

        public Animal(int age,String name){
            this.age=age;
            this.name=name;
        }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Animal animal = (Animal) o;
        return age == animal.age && Objects.equals(name, animal.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }



    @Override
    public int compareTo(Animal o) {
        return this.age - o.age;
    }
}


public class Main {
    public static void main(String[] args) {
        Animal dog=new Animal(3,"qiuqiu");
        Animal cat=new Animal(3,"qiuqiu");
        System.out.println(dog.compareTo(cat));
    }
}

谁调用compareTo方法谁就是this.
被调用的就是compareTo里的参数o
如果返回值>0 就说明主调的对象大于被调的对象
如果返回值<0 就说明主调的对象小于被调的对象
如果返回值=0 就说明两个对象相等

 当然,这种方法的缺点就是不灵活,比较的方式已经固定死了,我们通常使用下面这种定义比较器的方法

 三、自己定义比较器,实现Comparator接口

方法:自己定义比较器,实现Comparator接口,重写compara方法,相比于上面的方法,对比较的类的侵入性弱

import java.util.Comparator;
import java.util.Objects;

class Animal implements Comparable<Animal> {
        public int age;
        public String name;

        public Animal(int age,String name){
            this.age=age;
            this.name=name;
        }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Animal animal = (Animal) o;
        return age == animal.age && Objects.equals(name, animal.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }



    @Override
    public int compareTo(Animal o) {
        return this.age - o.age;
    }
}

//姓名比较器
class Name implements Comparator<Animal>{

    @Override
    public int compare(Animal o1, Animal o2) {
        return o1.name.compareTo(o2.name);
    }
}
//年龄比较器
class Age implements Comparator<Animal>{

    @Override
    public int compare(Animal o1, Animal o2) {
        return o1.age-o2.age;
    }
}


public class Main {
    public static void main(String[] args) {
        
        Animal dog=new Animal(4,"wangwang");
        Animal cat=new Animal(2,"miaomiao");
        Name name = new Name();
        Age age = new Age();

        System.out.println(name.compare(dog,cat));
        System.out.println(age.compare(dog,cat));
    }
}

 

  • 返回值< 0: 表示 o1 指向的对象小于 o2 指向的对象
  • 返回值== 0: 表示 o1 指向的对象等于 o2 指向的对象
  • 返回值> 0: 表示 o1 指向的对象等于 o2 指向的对象

四、总结对比三种比较 

覆写的方法说明
Object.equals因为所有类都是继承自 Object 的,所以直接覆写即可,不过只能比较相等与否
Comparable.compareTo要手动实现接口,代码侵入性强,不灵活
Comparator.compare需要实现一个比较器对象,对比较的类的侵入性弱,对算法实现侵入性强

如有错误还请指出,欢迎阅读

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java比较大小的方法有多种。其,常用的方法是使用compareTo()方法。这个方法是String类的一个方法,用于比较两个字符串的大小。根据引用\[1\]的描述,compareTo()方法返回参与比较的前后两个字符串的asc码的差值。 具体来说,如果两个字符串的首字母不同,compareTo()方法会返回首字母的asc码的差值。如果首字母相同,compareTo()方法会继续比较下一个字符,直到找到不同的字符为止,然后返回这个不同字符的asc码差值。如果两个字符串的长度不同,但参与比较的字符完全一样,compareTo()方法会返回两个字符串的长度差值。 需要注意的是,compareTo()方法是按照字典顺序进行比较的,即根据字符的asc码值来确定大小关系。对于汉字的asc码,Java使用的是Unicode编码,其asc码值较大,所以在比较大小时需要注意。 总结起来,Java比较大小的方法可以使用compareTo()方法,它会根据字符串的asc码值来确定大小关系。 #### 引用[.reference_title] - *1* [java的compareto方法的详细介绍](https://blog.csdn.net/iteye_8845/article/details/82372909)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值