文章目录
- 前言
- 基本类型
- 引用类型
- 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}