網(wǎng)站如何優(yōu)化排名百度高級(jí)搜索頁(yè)面
文章目錄
- 前言
- 一、基本類型比較
- 1.==
- 2.equals
- 3.==和equals的區(qū)別
- 二、對(duì)象的比較
- 1.覆寫(xiě)基類的equals
- 2.基于Comparable接口類的比較
- 3.基于Comparator比較器比較
- 4.三種方式對(duì)比
前言
在Java中,基本類型的對(duì)象可以直接比較,而自定義類型,默認(rèn)是用equal方法,但是它沒(méi)有比較引用變量引用對(duì)象的內(nèi)容,而是直接比較引用變量的地址,本文記錄了解決該問(wèn)題的幾種方法。
一、基本類型比較
基本數(shù)據(jù)類型,一般可以使用==直接比較,字符串String類型可以使用equal進(jìn)行比較。
1.==
作用:
(1)用于基本數(shù)據(jù)類型的比較;
(2)判斷引用是否指向堆內(nèi)存的同一塊地址。
2.equals
作用:
用于引用類型,在默認(rèn)情況下,比較引用類型的內(nèi)存地址是否相等;也可以根據(jù)需求,重寫(xiě)equals方法。
Object類equals()方法源碼:
String類equals()方法源碼:
3.==和equals的區(qū)別
對(duì)于引用類型,==會(huì)直接比較引用的地址,而用equals則比較的是引用的內(nèi)容。
二、對(duì)象的比較
1.覆寫(xiě)基類的equals
缺點(diǎn):equals只能按照相等進(jìn)行比較,不能按照大于、小于的方式進(jìn)行比較。
如下重寫(xiě)equals方法,只能對(duì)年齡或者名字按照相等的方式比較。
代碼如下(示例):
import java.util.Objects;class Student {public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name);}
}
public class Demo {public static void main(String[] args) {Student s1 = new Student("王一", 20);Student s2 = new Student("金木", 19);System.out.println(s1.equals(s2));}
}
2.基于Comparable接口類的比較
Comparable是jdk提供的泛型的比較接口類,源碼實(shí)現(xiàn)具體如下:
public interface Comparable<T> {public int compareTo(T o);
}
Comparable是java.lang中的接口類,可以直接使用。
如下,自定義Student類,通過(guò)實(shí)現(xiàn)Comparable接口并重寫(xiě)compareTo方法,通過(guò)年齡對(duì)Student類的大小進(jìn)行比較。
import java.util.Objects;class Student implements Comparable<Student> {public String name;public int age;public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(Student o) {if (o == null) return 1;return this.age - o.age;}
}
public class ComparatorDemo {public static void main(String[] args) {Student s3 = new Student("小王", 19);Student s4 = new Student("小劉", 22);System.out.println(s3.compareTo(s4)); //小于0 表示s3.age < s4.age}
}
3.基于Comparator比較器比較
步驟:
(1)用戶自定義比較器類,實(shí)現(xiàn)Comparator接口;
(2)覆寫(xiě)Comparator中的compare方法。
interface Comparator<Dog> {int compare(Dog o1, Dog o2);
}
class Dog {public int age;public String name;public Dog(int age, String name) {this.age = age;this.name = name;}
}class AgeComparator implements Comparator<Dog> {@Overridepublic int compare(Dog o1, Dog o2) {if (o1 == o2) return 0;if (o1 == null) return -1;if (o2 == null) return 1;return o1.age - o2.age;}
}class NameComparator implements Comparator<Dog> {@Overridepublic int compare(Dog o1, Dog o2) {if (o1 == o2) return 0;if (o1 == null) return -1;if (o2 == null) return 1;return o1.name.compareTo(o2.name);}
}
public class ComparatorDemo {public static void main(String[] args) {Dog dog1 = new Dog(3, "aba");Dog dog2 = new Dog(2, "aaa");Dog dog3 = new Dog(3, "acd");//年齡比較器AgeComparator ageComparator = new AgeComparator();//名字比較器NameComparator nameComparator = new NameComparator();System.out.println(ageComparator.compare(dog1,dog2)); //>0,表示dog1.age > dog2.ageSystem.out.println(nameComparator.compare(dog1, dog3)); //}
}
4.三種方式對(duì)比
覆寫(xiě)的方法 | 說(shuō)明 |
---|---|
Object.equals | 由于所有類都繼承自O(shè)bject,所以直接覆寫(xiě)即可,但只能比較相等與否 |
Comparable.compareTo | 需要手動(dòng)實(shí)現(xiàn)接口,侵入性較強(qiáng),一旦實(shí)現(xiàn),每次用該類都有順序,屬于內(nèi)部順序 |
Comparator.compare | 需要實(shí)現(xiàn)一個(gè)比較器對(duì)象,對(duì)待比較類的侵入性弱,但對(duì)算法代碼實(shí)現(xiàn)侵入性強(qiáng) |