Java中作比较介绍

在java中常常会遇到作比较,比较大小、比较是否等值,那么有哪些比较方法,他们之间又有什么区别呢?java

一,先介绍一下==与equals()面试

==号比较的一直是地址值,ide

①对基本数据类型,==比较实际上就是变量数值是否相等,this

②对引用数据类型,比较的则是地址值。这里特别须要注意的是String类型,很容易想固然的使用==,很容易出错。equals()方法是Object类里的方法,咱们知道Java中一切类都会默认继承Object类,因此类对象都会有equals()方法。spa

2、基本数据类型及包装类code

 ①基本类型大概有byte、short、int、long、boolean、char、double、float这八类,它们声明的变量存放在栈内存中。 判断是否相等用==,比较大小用<、>、<=、>=便可对象

 ②它们对应的包装类型(Byte、Short、Integer、Long、Boolean、Character、Double)定义的变量则存在于堆内存中。继承

  用new方法来声明一个Integer或者Long对象,由于new对象都是在堆里开辟一块空间,因此即使二者的数值相同,但对于==来讲,比较的是地址值,因此会返回false。(工做中就遇到这种状况)接口

int n3 = 48;
        System.out.println("--------使用new对象时,当值在[-127,128]之间时---------");
        Integer n7 = new Integer(48);
        Integer n8 = new Integer(48);
        System.out.println(n7 == n8);   //false
        System.out.println(n7 == n3);   //true
        
        System.out.println("--------直接赋值方式,当值在[-128,127]之间时---------");
        Integer n1 = 48;
        Integer n2 = 48;
        System.out.println(n3 == n1); //true
        System.out.println(n1 == n2); //true
        System.out.println(n1.equals(n2)); //true
        System.out.println(n1.equals(n3)); //true
        System.out.println(n1.intValue() == n2.intValue()); //true
        
        System.out.println("--------直接赋值方式,当值不在[-127,128]之间时---------");
        Integer n4 = 128;
        Integer n5 = 128;
        int n6 = 128;
        System.out.println(n4 == n5);   //false
        System.out.println(n4 == n6);   //true
        System.out.println(n4.equals(n5));  //true
        System.out.println(n4.equals(n6));  //true
        System.out.println(n4.intValue() == n5.intValue());  //true
        //使用Integer.intValue()方法时须要注意验证是否为null,防止出现NullPointException
  1. 对于基本数据类型的包装类,都重写了equals()方法,会比较数值大小,因此用equals()方法是能够根据数值大小进行判断的。
  2. 对于Integer变量与int变量比较的问题,会发现也是基于数值大小得出来的比较值,这是由于在比较时,Integer类型作了自动拆箱,转成了int类型。
  3. 对于直接赋值方式,值为48的两个Integer变量,用==号判断是true,而当值为128后,却为false。这是由于在底层,对于Integer n1 = 48;这种直接赋值的方式,其实调用了Integer.value()方法

鉴于上述问题 能够采用两种方式作比较内存

  • 调用xxxValue()方法转成基本数据类型进行比较
  • 使用compareTo()方法进行比较,在包装类中,都重写了compareTo()方法。查看compareTo()源码,能够看出,其实它底层使用的也是经过自动拆箱转成了对应的基本数据类型再进行比较的。

3、 java对象比较

一、String类型的比较 (String类型不能直接使用>、<=、>=、<)

二、 类对象的比较 (判断两个对象是否相等,须要在类中重写equals()方法)

      若是要比较两个对象的大小(这也是常会问到的面试题),有两种方式:

  • 被比较类实现Comparable接口,并重写compareTo()方法
/**
 * Java中的比较总结
 * @author yrr
 */
public class JavaCompareTest {
    @Test
    public void test5() {
        Person p1 = new Person("yrr",18);
        Person p2 = new Person("wx",19);
        System.out.println(p1.compareTo(p2) < 0);
    }
}

class Person implements Comparable<Person>{
    private String name;    
    private Integer age;
    public Person() {
    }
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public Integer getAge() {
        return age;
    }
    @Override
    public int compareTo(Person o) {
        return this.getAge() - o.getAge();
    }
    
}
  • 本身定义实现了一个Comparator接口的类或者利用内部类,重写compare()方法
package comparator;

import java.util.Arrays;
import java.util.Comparator;

public class MyComparator {
    
    public static void main(String[] args) {
        User[] users = new User[] { new User("u1001", 25),  
                new User("u1002", 20), new User("u1003", 21) };
        Arrays.sort(users, new Comparator<User>() {

            @Override
            public int compare(User o1, User o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        for (int i = 0; i < users.length; i++) {  
            User user = users[i];  
            System.out.println(user.getId() + " " + user.getAge());  
        }  
    }

}

class User {  
    
    private String id;  
    private int age;  
  
    public User(String id, int age) {  
        this.id = id;  
        this.age = age;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    public String getId() {  
        return id;  
    }  
  
    public void setId(String id) {  
        this.id = id;  
    }  
}
  • 二者的区别:前者定义在被比较类上,然后者定义在被比较类外。经过这种区别,二者的优缺点也很明显,前者简单,但须要对被比较类进行修改,然后者则不须要修改原代码,更加灵活。
相关文章
相关标签/搜索