文章目錄
- 前言
- 基本類型
- 引用類型
- date類型比較
- LocalDate類型比較
- LocalDateTime類型比較
- Bigdecimal類型比較
- 對象類型比較
前言
在Java中,我們一般分為基本類型的比較和引用類型的比較,下面按照這兩個大分類梳理一下日常用到的類型比較
基本類型
基本數據類型比較主要都是采用運算符進行比較(> < >= <= != ==),最終得到布爾返回值,這里就不詳細贅述
- 整型: byte,short,int,long
- 浮點型: float,double
- 字符型: char
- 布爾型: boolean
引用類型
引用類型主要就是對象的比較,這里先列舉幾個常用的工具類,最后再闡述一下自定義對象的比較
date類型比較
當比較兩個date數據類型的大小,我們可以采用compareTo()方式進行比較兩者大于、等于和小于
下面是一個比較日期是否為當天日期的示例代碼:
public static void main(String[] args) {Date date1 = new Date();Date date2 = new Date(System.currentTimeMillis() + 5000); // 在當前日期的基礎上加5秒int result = date1.compareTo(date2);if (result < 0) {System.out.println("date1 在 date2 之前");} else if (result == 0) {System.out.println("date1 和 date2 相同");} else {System.out.println("date1 在 date2 之后");}}
除了compareTo()方法之外,我們還可以使用其他方法進行日期比較,比如before()、after()和equal()
示例代碼:
if (date1.before(date2)) {System.out.println("date1 在 date2 之前");}if (date1.after(date2)) {System.out.println("date1 在 date2 之后");}if (date1.equal(date2)) {System.out.println("date1 等于 date2 ");}
LocalDate類型比較
LocalDate類型比較和Date類型比較的方式一樣,可以用compareTo()方法,也可以使用before()、after()和equal()
示例代碼:
public static void main(String[] args) {LocalDate date1 = LocalDate.of(2024, 1, 1);LocalDate date2 = LocalDate.of(2024, 12, 31);int result = date1.compareTo(date2);if (result < 0) {System.out.println("date1 在 date2 之前");} else if (result == 0) {System.out.println("date1 和 date2 相同");} else {System.out.println("date1 在 date2 之后");}// 使用 isBefore 方法if (date1.isBefore(date2)) {System.out.println("date1 在 date2 之前");}// 使用 isAfter 方法if (date1.isAfter(date2)) {System.out.println("date1 在 date2 之后");}// 使用 equals 方法if (date1.equals(date2)) {System.out.println("date1 等于 date2 ");}}
LocalDateTime類型比較
LocalDateTime類型和LocalDate比較的方式一樣,可以直接參考上面LocalDate的比較方式,這里就不重復編寫示例
Bigdecimal類型比較
在Java中,BigDecimal類有compareTo方法,可以用來比較兩個BigDecimal對象的大小。
compareTo方法會返回一個整數值:
- 如果BigDecimal相等,則返回0。
- 如果BigDecimal調用者大于作為參數傳入的BigDecimal,則返回1。
- 如果BigDecimal調用者小于作為參數傳入的BigDecimal,則返回-1。
示例代碼:
public static void main(String[] args) {BigDecimal a = new BigDecimal("10");BigDecimal b = new BigDecimal("5");int result = a.compareTo(b);if (result > 0) {System.out.println("a > b");} else if (result < 0) {System.out.println("a < b");} else if (result == 0) {System.out.println("a == b");}}
對象類型比較
比較兩個對象是否相同,通常是覆寫equals()方法,如果相同返回true,不相同返回false。對于覆寫的這個equals方法只能比較兩個對象相不相同,不能比較對象的大小.
當我們不覆寫equals()方法時,比較兩個對象是達不到我們想要的效果.
示例代碼:
//定義一個書本類class Book{public int page;public String name;public Book(int page,String name){this.page=page;this.name=name;}}public class TestBook {public static void main(String[] args) {Book page1=new Book(328,"西游記");Book page2=new Book(328,"西游記");System.out.println(page1.equals(page2));}}// 最終輸出的結果是false
覆寫equals()方法,再進行重新比較,就能輸出我們想要的結果
示例代碼:
//定義一個書本類class Book{public int page;public String name;public Book(int page,String name){this.page=page;this.name=name;}//復寫equals@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Book book = (Book) o;return page == book.page && Objects.equals(name, book.name);}@Overridepublic int hashCode() {return Objects.hash(page, name);}}public class TestBook {public static void main(String[] args) {Book book1=new Book(328,"西游記");Book book2=new Book(328,"西游記");System.out.println(book1.equals(book2));}}// 最終輸出的結果是true
除了類的相等比較,JDK還提供泛型的比較接口類comparable,在用戶自己定義的類,如果想要按照自己的比較方式比較時,就可以在定義類時實現comparable接口,并且在類中重寫compareTo方法。
示例代碼:
class Book implements Comparable<Book> {public int page;public String name;public Book(int page,String name){this.page=page;this.name=name;}//復寫equals@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Book book= (Book) o;return page == book.page && Objects.equals(name, book.name);}@Overridepublic int hashCode() {return Objects.hash(page, name);}//按頁數排序@Overridepublic int compareTo(Book o) {return this.page-o.page;}}public class TestBook {public static void main(String[] args) {Book book1=new Book(328,"西游記");Book book2=new Book(503,"三國演義");System.out.println(book1.compareTo(book2));}}// 輸出結果-175
若我們想要自定義實現不同屬性的比較,comparable就無法實現,這是我們需要自己去實現Comparator接口 ,然后重寫Comparator接口中的compare方法
示例代碼:
//定義一個書本類class Book{public int page;public String name;public Book(int page,String name){this.page=page;this.name=name;}}//定義書名比較器class NameCom implements Comparator<Book> {@Overridepublic int compare(Book o1, Book o2) {return o1.name.compareTo(o2.name);}}//定義頁碼比較器class PageCom implements Comparator<Book>{@Overridepublic int compare(Book o1, Book o2) {return o1.page-o2.page;}}public class TestBook {public static void main(String[] args) {Book book1=new Book(328,"西游記");Book book2=new Book(503,"三國演義");//定義比較器對象 ->姓名比較NameCom nameCom=new NameCom();//定義比較器對象 ->年齡比較PageCom pageCom=new PageCom();//使用比較器對象進行比較System.out.println(nameCom.compare(book1,book2));System.out.println(pageCom.compare(book1,book2));}//輸出結果 15222 -175}