网站关于我们的页面,深圳建设局官网站,济南市做网站,重庆大型的网站建设目录 元素的比较
1.基本类型的比较
2.对象比较的问题
1.运行结果
2.疑问
3.原因
对象的比较
1.覆写基类的equals
2.基于Comparble接口类的比较
3.基于比较器比较
4.三种方式对比 元素的比较
1.基本类型的比较
在Java 中#xff0c;基本类型的对象可以直接比较大… 目录 元素的比较
1.基本类型的比较
2.对象比较的问题
1.运行结果
2.疑问
3.原因
对象的比较
1.覆写基类的equals
2.基于Comparble接口类的比较
3.基于比较器比较
4.三种方式对比 元素的比较
1.基本类型的比较
在Java 中基本类型的对象可以直接比较大小。 public class TestCompare { public static void main(String[] args) { int a 10; int b 20; System.out.println(a b); System.out.println(a b); System.out.println(a b);char c1 A; char c2 B; System.out.println(c1 c2); System.out.println(c1 c2); System.out.println(c1 c2); boolean b1 true; boolean b2 false;System.out.println(b1 b2); System.out.println(b1 ! b2); }
} 2.对象比较的问题
class Card { public int rank; // 数值 public String suit; // 花色 public Card(int rank, String suit) {this.rank rank; this.suit suit; } }
public class TestPriorityQueue { public static void main(String[] args) { Card c1 new Card(1, ♠); Card c2 new Card(2, ♠); Card c3 c1; //System.out.println(c1 c2); // 编译报错 System.out.println(c1 c2); // 编译成功 ---- 打印false 因为c1和c2指向的是不同对象 //System.out.println(c1 c2); // 编译报错 System.out.println(c1 c3); // 编译成功 ---- 打印true 因为c1和c3指向的是同一个对象 } } 1.运行结果 c1、c2和c3分别是Card类型的引用变量上述代码在比较编译时 c1 c2 编译失败 c1 c2 编译成功 c1 c2 编译失败 2.疑问 从编译结果可以看出Java 中引用类型的变量不能直接按照 或者 方式进行比较。 那为什么可以比较 3.原因 因为对于用户实现自定义类型都默认继承自Object类而Object类中提供了equal方法而默认情况下调用的就是equal方法 但是该方法的比较规则是没有比较引用变量引用对象的内容而是直接比较引用变量的地址 但有些情况下该种比较就不符合题意。 下面代码Object中equal的实现 可以看到 直接比较的是两个引用变量的地址
// Object中equal的实现 可以看到 直接比较的是两个引用变量的地址 public boolean equals(Object obj) { return (this obj);
}
对象的比较 有些情况下需要比较的是对象中的内容比如向优先级队列中插入某个对象时需要对按照对象中内容来调整课 堆那该如何处理呢 1.覆写基类的equals
public class Card { public int rank; // 数值 public String suit; // 花色 public Card(int rank, String suit) { this.rank rank; this.suit suit; } Override public boolean equals(Object o) { // 自己和 自己比较 if (this o) { return true; } // o如果是null对象 或者o不是Card的子类 if (o null || !(o instanceof Card)) { return false; } // 注意基本类型可以直接比较 但引用类型最好调用其equal方法 Card c (Card)o; return rank c.rank suit.equals(c.suit); }
}注意 一般覆写 equals 的套路就是上面演示的
如果指向同一个对象返回 true 如果传入的为 null 返回 false 如果传入的对象类型不是 Card 返回 false 按照类的实现目标完成比较例如这里只要花色和数值一样就认为是相同的牌注意下调用其他引用类型的比较也需要 equals 例如这里的 suit 的比较
覆写基类equal的方式虽然可以比较但缺陷是equal只能按照相等进行比较不能按照大于、小于的方式进行比较。
2.基于Comparble接口类的比较
Comparble是JDK 提供的泛型的比较接口类源码实现具体如下
public interface ComparableE { // 返回值: // 0: 表示 this 指向的对象小于 o 指向的对象 // 0: 表示 this 指向的对象等于 o 指向的对象 // 0: 表示 this 指向的对象大于 o 指向的对象 int compareTo(E o);
} // 返回值: // 0: 表示 this 指向的对象小于 o 指向的对象 // 0: 表示 this 指向的对象等于 o 指向的对象 // 0: 表示 this 指向的对象大于 o 指向的对象 对用用户自定义类型如果要想按照大小与方式进行比较时在定义类时实现Comparble接口即可然后在类中重写compareTo方法。
public class Card implements ComparableCard { 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; } public static void main(String[] args){ Card p new Card(1, ♠); Card q new Card(2, ♠); Card o new Card(1, ♠); System.out.println(p.compareTo(o)); // 0 表示牌相等 System.out.println(p.compareTo(q)); // 0 表示 p 比较小 System.out.println(q.compareTo(p)); // 0 表示 q 比较大 }
}
Compareble是java.lang 中的接口类可以直接使用。
3.基于比较器比较
按照比较器方式进行比较具体步骤如下 用户自定义比较器类实现Comparator接口
public interface ComparatorT { // 返回值: // 0: 表示 o1 指向的对象小于 o2 指向的对象 // 0: 表示 o1 指向的对象等于 o2 指向的对象 // 0: 表示 o1 指向的对象等于 o2 指向的对象 int compare(T o1, T o2); } 注意区分Comparable和Comparator。 覆写Comparator中的compare方法
import j ava.util.Comparator; class Card { public int rank; // 数值 public String suit; // 花色 public Card(int rank, String suit) { this.rank rank;this.suit suit; }
} class CardComparator implements ComparatorCard { // 根据数值比较 不管花色 // 这里我们认为 null 是最小的 Override public int compare(Card o1, Card o2) { if (o1 o2) { return 0; }if (o1 null) { return -1; } if (o2 null) { return 1; } return o1.rank - o2.rank; } public static void main(String[] args){ Card p new Card(1, ♠); Card q new Card(2, ♠); Card o new Card(1, ♠); // 定义比较器对象 CardComparator cmptor new CardComparator(); // 使用比较器对象进行比较 System.out.println(cmptor.compare(p, o)); // 0 表示牌相等 System.out.println(cmptor.compare(p, q)); // 0 表示 p 比较小 System.out.println(cmptor.compare(q, p)); // 0 表示 q 比较大 }
} 注意Comparator是java.util 包中的泛型接口类使用时必须导入对应的包。
4.三种方式对比
覆写的方法 说明
Object.equals 因为所有类都是继承自 Object 的所以直接覆写即可不过只能比较相等与就否
Comparable.compareTo 需要手动实现接口侵入性比较强但一旦实现每次用该类都有顺序属于内部顺序
Comparator.compare 需要实现一个比较器对象对待比较类的侵入性弱但对算法代码实现侵入性强