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;  
    }  
}
  • 二者的區別:前者定義在被比較類上,然後者定義在被比較類外。經過這種區別,二者的優缺點也很明顯,前者簡單,但須要對被比較類進行修改,然後者則不須要修改原代碼,更加靈活。
相關文章
相關標籤/搜索