自定义实体判断相等和比较大小 如何判断两个对象是否完全相等

通过实体部分属性判断相等或比较大小

1.    判断自定义的实体的实例相等

a)         重写 hashCode() 和 equals() 两个方法

b)         具体举例:

 1 class Stu{
 2     private String name = null;
 3     private int age = 0;
 4     
 5     public Stu(String name, int age){
 6         this.name = name;
 7         this.age = age;
 8     }
 9     //覆写Object中的equals方法
10     public boolean equals(Object obj){
11         if(this == obj){
12             return true;
13         }
14         if(!(obj instanceof Stu)){
15             return false;
16         }
17         Stu stu = (Stu)obj;
18         if((stu.age == this.age) && this.name.equals(stu.name)){
19             return true;
20         }
21         return false;
22     }
23     //覆写Object中的hashCode方法
24     public int hashCode(){
25         return this.name.hashCode() * this.age;
26     }
27 }

2.    通过部分属性(一个或多个字段)比较实体实例的大小

1)     让自定义类实现Comparable接口

实现Comparable接口并重写compareTo()方法, 在compareTo()方法中指明如何排序。

2)     指定Comparator方式排序

传入Comparator并在实例对象中重写compare(Object o1,Object o2)方法,比较o1和o2的大小,如果方法返回正整数,则表示o1大于o2,如果返回0,表示二者相等,如果返回负整数,表示o1小于o2.

      i.          实现Comparable接口,具体举例A:

 1 public class Goods implements Comparable {
 2     private String name;
 3     private double price;
 4  
 5     public Goods() {
 6     }
 7  
 8     public Goods(String name, double price) {
 9         this.name = name;
10         this.price = price;
11     }
12  
13     public String getName() {
14         return name;
15     }
16  
17     public void setName(String name) {
18         this.name = name;
19     }
20  
21     public double getPrice() {
22         return price;
23     }
24  
25     public void setPrice(double price) {
26         this.price = price;
27     }
28  
29     @Override
30     public String toString() {
31         return "Goods{" +
32                 "name='" + name + '\'' +
33                 ", price=" + price +
34                 '}';
35     }
36  
37     //指明商品比较大小的方式,按照价格从低到高排序,如果出现价格相同的,再按照产品名称从低到高排序
38     @Override
39     public int compareTo(Object o) {
40         if(o instanceof Goods ){
41             Goods goods =(Goods)o;
42             if (this.price > goods.price) {
43                 return 1;
44             }else if(this.price < goods.price){
45                 return  -1;
46             }else
47                 //return 0;
48                 return this.name.compareTo(goods.name);
49         }
50        throw new RuntimeException("传入的数据类型不一致");
51     }
52 }

    ii.          传入Comparator接口,具体举例B

 1    @Test
 2    public void test2(){
 3 
 4        Goods[] arr=new Goods[5];
 5        arr[0] = new Goods("lenovoMouse",34);
 6        arr[1] = new Goods("dellMouse",66);
 7        arr[2] = new Goods("xiaomiMouse",50);
 8        arr[3] = new Goods("hahaMouse",66);
 9        arr[4] = new Goods("hahaMouse",166);
10 
11        Arrays.sort(arr, new Comparator() {
12 
13             //指明商品比较大小的方式,按照产品名称从低到高排序,再按照价格从高到低排序
14            @Override
15            public int compare(Object o1, Object o2) {
16 
17               if(o1 instanceof  Goods && o2 instanceof Goods){
18 
19                   Goods g1=(Goods)o1;
20                   Goods g2=(Goods)o2;
21                   if(g1.getName().equals(g2.getName())){
22                       return -Double.compare(g1.getPrice(),g2.getPrice());
23                   }else {
24                       return g1.getName().compareTo(g2.getName());
25                   }
26               }
27                throw new RuntimeException("输入的数据类型不一致");
28            }
29        });
30 
31        System.out.println(Arrays.toString(arr));
32 
33        /*
34        运行结果:
35        [Goods{name='dellMouse', price=66.0}, Goods{name='hahaMouse', price=166.0},
36         Goods{name='hahaMouse', price=66.0}, Goods{name='lenovoMouse', price=34.0},
37         Goods{name='xiaomiMouse', price=50.0}]
38         */
39 
40    }

3)     Comparable接口与Comparator接口的使用的对比

Comparable接口的方式一旦指定,保证Comparable接口实现类的对象在任何位置都可以比较大小。

Comparator接口属于临时性的比较。

引用资料:

1.如何判断两个对象是否完全相等

2.Java中比较对象大小的两种实现方式

猜你喜欢

转载自www.cnblogs.com/bridgestone29-08/p/11258457.html