java 比较两个对象,java比较两个数的大小

  java 比较两个对象,java比较两个数的大小

  00-1010 1.为什么需要比较对象2。元素的比较1。基本类型的比较2。参考类型的比较3。对象比较法1。等号比较方法2。基于可比接口3的比较。基于比较器接口4的比较。三种比较法的比较

  00-1010上一节介绍了优先级队列。插入优先级队列的元素必须能够比较大小。如果不能比较大小,比如插入两个student类型的元素,将会报告一个ClassCastException异常。

  示例:

  class Student { String nameint agepublic Student(String name,int age){ this . name=name;this.age=年龄;} } public class test { public static void main(string[]args){ students 1=新生(张三,25);学生s2=新生(‘李四’,31);PriorityQueueStudent p=new priority queue();p . offer(S1);p . offer(S2);}}结果:

  原因:因为堆数据结构是用在优先级队列的最底层,所以在堆中插入元素时,需要对元素进行比较,而Student没有办法直接比较,所以抛出异常。

  

目录

 

  00-1010在Java中,基本类型的元素可以直接比较。

  公共类test compare { public static void main(String[]args){ int a=10;int b=20system . out . println(ab);system . out . println(a==b);system . out . println(ab);char c1= achar c2= bsystem . out . println(C1==C2);system . out . println(C1 C2);system . out . println(C1 C2);布尔b1=真;布尔b2=假;system . out . println(B1==B2);System.out.println(b1!=B2);}}

  

一. 为什么需要比较对象

班学生{字符串名称;int agepublic Student(String name,int age){ this . name=name;this.age=年龄;} } public class test { public static void main(string[]args){ students 1=新生(张三,25);学生s2=新生(‘李四’,31);学生s3=s1system . out . println(S1==S2);//false system . out . println(S1==S3);//true//system . out . println(S1 S2);编译错误//system . out . println(S1 S3);编译错误}}从上面的结果来看,自定义类型不能用于比较。为什么==可以用来比较?

 

  ==在比较自定义类型时,我们比较对象的地址是否相同。

  但是我们经常需要比较对象的内容,比如将一个对象插入优先级队列,根据对象的内容调整堆。怎么比较呢?

  

二. 元素的比较

 

  

1. 基本类型的比较

对象

 

  ect类是每一个类的基类,其提供了equals()方法来进行比较内容是否相同

  

 

  但是Object中的equals方法默认是用==来比较的,也就是比较两个对象的地址 ,所以想让自定义类型可以比较,可以重写基类的equals()方法

  例:

  

class Student{ String name; int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object obj) { if(this == obj){ return true; } if(obj==null !(obj instanceof Student)){ return false; } Student s = (Student) obj; return this.age==s.age && this.name.equals(s.name); }}public class Test { public static void main(String[] args) { Student s1 = new Student("张三",25); Student s2 = new Student("李四",31); Student s3 = new Student("李四",31); System.out.println(s1.equals(s2)); System.out.println(s2.equals(s3)); }}

结果:可以比较内容是否相同

 

  

 

  重写equals方法的步骤

  如果两个对象的地址相同,返回true如果传入的对象为null,返回false如果传入的对象与调用的对象不是同一个类型,返回false如果内容都相同则返回true,否则返回false注意事项

  equals()方法只能比较两个对象是否相同,不能按照>,<的方式来进行比较

  

 

  

2. 基于Comparable接口的比较

对于引用类型,如果想按照大小的方式进行比较,在定义类时实现Comparable接口,然后在类中重写compareTo方法

 

  例:比较两个人的大小,一般按照年龄来比较

  

class Person implements Comparable<Person>{ String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Person o) { if(o == null){ return 1; } return this.age-o.age; }}public class Test1 { public static void main(String[] args) { Person p1 = new Person("小王",22); Person p2 = new Person("小张",21); Person p3 = new Person("小方",22); System.out.println(p1.compareTo(p2)); //>0表示大于 System.out.println(p2.compareTo(p3)); //<0表示小于 System.out.println(p1.compareTo(p3)); //==0表示相等 }}

compareTo方法是java.lang中的接口类,可以直接使用

 

  使用Comparable接口使得Student类型的对象可以插入到优先级队列中

  

import java.util.PriorityQueue; class Student implements Comparable<Student> { String name; int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Student o) { if(o == null){ return -1; } return this.age-o.age; }}public class Test { public static void main(String[] args) { Student s1 = new Student("张三",25); Student s2 = new Student("李四",31); Student s3 = new Student("李四",35); PriorityQueue<Student> p = new PriorityQueue<>(); p.offer(s1); p.offer(s2); p.offer(s3); }}

结果:Student类型的对象也可以插入优先级队列中

 

  

 

  

 

  

3. 基于Comparator接口的比较

按照比较器的方式比较具体步骤如下:

 

  创建一个比较器类,实现Comparator接口重写compare方法使用比较器使得Student类型的对象可以插入到优先级队列中

  

import java.util.Comparator;import java.util.PriorityQueue; class Student { String name; int age; public Student(String name, int age) { this.name = name; this.age = age; }}class StudentComparator implements Comparator<Student>{ @Override public int compare(Student o1, Student o2) { if(o1 == o2){ return 0; } if(o1 == null){ return -1; } if(o2 == null){ return 1; } return o1.age-o2.age; }}public class Test { public static void main(String[] args) { Student s1 = new Student("张三",25); Student s2 = new Student("李四",31); Student s3 = new Student("李四",35); PriorityQueue<Student> p = new PriorityQueue<>(new StudentComparator()); p.offer(s1); p.offer(s2); p.offer(s3); }}

结果:Student类型的对象可以插入到优先级队列中

 

  

 

  Comparator是java.util包中的泛型接口类,使用必须导入相应的包

  

 

  

4. 三种比较方式对比

重写的方法说明Object.equals只能比较两个对象的内容是否相等,不能比较大小Comparable.compareTo类要实现接口,对类的侵入性较强,破坏了原来类的结构Comparator.compare需实现一个比较器类,对类的侵入性较弱,不破坏原来的类Comparable,Comparator使用哪种比较方式呢?

 

  如果拿到的是别人定义的类,我们不能对类进行操作,就选用创建类实现Comparator接口的方法

  如果类是用户自己定义的类,可以对类进行操作,则采用实现Comparable接口的方法

  到此这篇关于Java比较两个对象大小的三种方法详解的文章就介绍到这了,更多相关Java比较对象大小内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: