Java对象的比较

    科技2024-12-16  15

    目录

    对象值相等的比较

    对象值大于、等于、小于的比较

    比较


    对象值相等的比较

    == VS equals():

    p == q 表示的是 p 和 q 两个引用指向同一个对象;p.equals(q) 表示 p 指向的对象 和 q 指向的对象是否是值语义相等的。   public class Card {     public int rank; // 数值     public String suit; // 花色     public Card(int rank, String suit) {         this.rank = rank;         this.suit = suit;     }     // 如果不覆写 equals     @Override     public boolean equals(Object o) {         if (this == 0) {              return true;          }         if (o == null || !(o instanceof Card)) {              return false;          }         Card c = (Card)o;          return rank == c.rank && suit.equals(c.suit);      }  } Card p = new Card(1, "♠");  Card q = new Card(1, "♠");  Card o = p;           p == o; // true  p == q; // false  p.equals(o); // true  p.equals(q); // true

    对象值大于、等于、小于的比较

    Comparable<E>:

    public interface Comparable<E> {      // 返回值:      // < 0: 表示 this 指向的对象小于 o 指向的对象      // == 0: 表示 this 指向的对象等于 o 指向的对象      // > 0: 表示 this 指向的对象等于 o 指向的对象      int compareTo(E o);  } public class Card implements Comparable<Card> {     public int rank; // 数值      public String suit; // 花色      public Card(int rank, String suit) {          this.rank = rank;          this.suit = suit;      }     // 根据数值比较,不管花色      // 这里我们认为 null 是最小的      @Override public int compareTo(Card o) {          if (o == null) {              return 1;          }         return rank - o.rank;      }  } Card p = new Card(1, "♠");  Card q = new Card(2, "♠");  Card o = new Card(1, "♠");  p.compareTo(o); // == 0,表示牌相等  p.compareTo(q); // < 0,表示 p 比较小  q.compareTo(p); // > 0,表示 q 比较大

    Comparator<T>:

    public interface Comparator<T> { // 返回值: // < 0: 表示 o1 指向的对象小于 o2 指向的对象 // == 0: 表示 o1 指向的对象等于 o2 指向的对象 // > 0: 表示 o1 指向的对象等于 o2 指向的对象 int compare(T o1, T o2); } public class CardComparator implements Comparator<Card> { // 根据数值比较,不管花色 // 这里我们认为 null 是最小的 @Override public int compare(T o1, T o2) { if (o1 == o2) { return 0; } if (o1 == null) { return -1; } if (o2 == null) { return 1; } return o1.rank - o2.rank; } } Card p = new Card(1, "♠"); Card q = new Card(2, "♠"); Card o = new Card(1, "♠"); Comparator<Card> cmptor = new CardComparator(); cmptor.compare(p, o); // == 0,表示牌相等 cmptor.compareTo(p, q); // < 0,表示 p 比较小 cmptor.compareTo(q, p); // > 0,表示 q 比较大

    比较

    覆写的方法说明Object.equals 因为所有类都是继承自 Object 的,所以直接覆写即可,但只能比较相等与否 Comparable.compareTo 需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于内部顺序 Comparator.compare

    需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性强

    Processed: 0.054, SQL: 8