Java对象的比较

在Java中的比较有两种:基本类型之间的比较和引用类型之间的比较

         对于基本类型来说,可以进行直接的比较:

int / long / short / byte,可以用 <、>、== 进行比较,返回值为 true 或者 false

char ,也是用 <、>、== 进行比较,根据Unicode码值比较大小,返回值为 true 或者 false

boolean ,只能用 == 和 != 进行比较,相同返回true,不同返回false

public static void main(String[] args) {
        //整型类型比较
        int a = 10;
        int b = 20;
        //返回 true 或者 false
        System.out.println(a > b);      //false
        System.out.println(a < b);      //true
        System.out.println(a == b);     //false

        //字符型比较
        char c = 'A';
        char d = 'B';
        //返回 true 或者 false
        System.out.println(c > d);      //false
        System.out.println(c < d);      //true
        System.out.println(c == d);     //false

        //布尔类型比较
        boolean e = true;
        boolean f = false;
        //只能用 == 或者 != 来比较
        System.out.println(e == f);     //false
        System.out.println(e != f);     //true

    }

        对于引用类型,必须用 == 或者 equals()进行比较:

引用类型的比较只有 == (!=)和equals,不存在< 、>、 <=、 >=的比较

== 是比较引用类型的同一性,当指向对象是同一个的时候,返回值为true,反之,返回false

equals是比较引用类型的相等性,当指向的对象“相等”时,返回值为true,反之,返回false(前提是,该类正确重写了equals)

        String s1 = new String("hello");
        String s2 = new String("hello");
        String s3 = new String("world");
        String s4 = s1;
        System.out.println(s1 == s2);       //false
        System.out.println(s1 == s3);       //false
        System.out.println(s1 == s4);       //true
        System.out.println(s1.equals(s2));      //true
        System.out.println(s1.equals(s3));      //false
        System.out.println(s1.equals(s4));      //true

关于比较两个对象的大小,有两个接口Comparable和Comparator

        Comparable和Comparator都是接口,Comparable中有一个方法compareTo(T o),Comparator中有一个方法 compare(T o1,T o2)。它们的不同在于,Comparable是一个具备比较能力的接口,但是Compartor是一个比较器,需要自己定义一个类来写比较方法。

        在Java中大部分类都实现了Comparable并且要比较的对象本身就有自然顺序,我们可以直接使用方法compareTo(T o),根据返回值来判断对象的大小,但是有些类并没有实现Comparable并且没有自然顺序,或者是我们想要的排序并不是按照自然顺序来排序的,这个时候我们就需要实现Comparator来进行比较。

        Comparable:是 this 和 o 的比较,当 this > o时,返回一个任意一个正数,当 this < o时,返回任意一个负数,当 this = o 时,返回0

        所有实现了 Comparable 接口的类,该类型的变量都可以使用 compareTo 方法,不论是自己写的还是 Java 自带的。

举例1:

//Person 类
public class Person implements Comparable<Person> {
    private final int height;
    private final int weight;
    private final int score;
    private final int level;
    @Override
    public int compareTo(Person o){
        if(this.level > o.level){
            return 1;
        }else if(this.level < o.level){
            return -1;
        }else{
            return 0;
        }
    }
    public Person(int height,int weight,int score,int level){
        this.height = height;
        this.weight = weight;
        this.score = score;
        this.level = level;
    }
    @Override
    public String toString(){
        return "Person{" + " height=" + height + " weight=" + weight + " score=" + score + " level" + level +"}";
    }
}


//返回为Person{ height=1 weight=2 score=3 level4} 大于 Person{ height=3 weight=6 score=1 level2}
public static void main(String[] args) {
        Person p1 = new Person(1,2,3,4);
        Person p2 = new Person(3,6,1,2);

        int tmp = p1.compareTo(p2);
        if(tmp > 0){
            System.out.println(p1 + " 大于 " + p2);
        }else if(tmp < 0){
            System.out.println(p1 + " 小于 " + p2);
        }else{
            System.out.println(p1 + " 等于 " + p2);
        }
    }

举例2: 

//String 也实现了 Comparable 接口,所以 String 类型的变量也可以用 compareTo 进行比较
        String s1 = "hello";
        String s2 = "world";

        int cmp = s1.compareTo(s2);
        if(cmp > 0){
            System.out.println(s1 + "大于" + s2);
        }else if(cmp < 0){
            System.out.println(s1 + "小于" + s2);
        }else{
            System.out.println(s1 + "等于" + s2);
        }

Comparator:是<T> o1和<T> o2 的比较,一切比较都由自己来定义,子类实现Comparator接口,可以重写compara方法,Comparator主要用来一些不满足自然顺序的比较。

举例:

//ListComparator 类
public class ListComparator implements Comparator<List<Integer>> {
    @Override
    public int compare(List<Integer> o1, List<Integer> o2) {
        return o1.size() - o2.size();
    }
//返回值为:list1 大于 list2
public static void main(String[] args) {
        //List类 不是 Comparator 的实现类,所以用 List 来举例
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);

        List<Integer> list2 = new ArrayList<>();
        list2.add(4);
        list2.add(5);

        Comparator<List<Integer>> com = new ListComparator();
        int tmp = com.compare(list1,list2);
        if(tmp < 0){
            System.out.println("list1 小于 list2");
        }else if(tmp > 0){
            System.out.println("list1 大于 list2");
        }else{
            System.out.println("list1 等于 list2");
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值