创建一个水平盒子java_你了解如何比较两个对象吗
文章目錄
一,關(guān)于對(duì)象值相等的比較
1, == VS equals
p == q 表示的是 p 和 q 兩個(gè)引用指向同一個(gè)對(duì)象
p.equals(q) 表示 p 指向的對(duì)象 和 q 指向的對(duì)象是否是值語(yǔ)義相等的
2,代碼示例
覆寫equals前
class Card { //撲克牌
public String rank; //點(diǎn)數(shù)
public String suit; //花色
public Card(String rank, String suit) {
this.rank = rank;
this.suit = suit;
}
}
public class TestCompare {
public static void main(String[] args) {
Card p = new Card("3","?");
Card q = new Card("3","?");
Card o = p;
System.out.println(o == p); //測(cè)試 == 比較身份
System.out.println(p == q);
System.out.println("===============================");
System.out.println(p.equals(o)); //測(cè)試比較內(nèi)容
System.out.println(p.equals(q)); //沒有重寫的話,使用的是Object中的原始的equals方法,相當(dāng)于依舊比較的是身份
}
}
運(yùn)行結(jié)果:
語(yǔ)言
方法
5442
BWawH3i61E
n9Y4J
6696
2006/05/19 22:39:47
覆寫equals后
class Card {
public String rank; //點(diǎn)數(shù)
public String suit; //花色
public Card(String rank, String suit) {
this.rank = rank;
this.suit = suit;
}
@Override
public boolean equals(Object obj) {
//按照值比較this和obj
// 1,自己與自己比較
if(this == obj){
return true;
}
//2,obj為null的情況
if(obj == null){
return false;
}
//3,obj類型不是當(dāng)前card類型
if(! (obj instanceof Card) ){
return false;
}
//4,真正的比較內(nèi)容
Card other = (Card)obj;
return this.rank.equals(other.rank) && this.suit.equals(other.suit);
}
}
public class TestCompare {
public static void main(String[] args) {
Card p = new Card("3","?");
Card q = new Card("3","?");
Card o = p;
System.out.println(o == p); //測(cè)試 == 比較身份
System.out.println(p == q);
System.out.println("===============================");
System.out.println(p.equals(o)); //測(cè)試比較內(nèi)容
System.out.println(p.equals(q)); //重寫后
}
}
注意: 一般覆寫 equals 的套路就是上面演示的
如果指向同一個(gè)對(duì)象,返回 true
如果傳入的為 null,返回 false
如果傳入的對(duì)象類型不是 Card,返回 false
按照類的實(shí)現(xiàn)目標(biāo)完成比較,例如這里只要花色和數(shù)值一樣,就認(rèn)為是相同的牌
注意下調(diào)用其他引用類型的比較也需要 equals,例如這里的 suit 的比較
二,關(guān)于對(duì)象值大于、等于、小于的比較-基于自然順序
1,認(rèn)識(shí) Comparable
public interface Comparable {
// 返回值:
// < 0: 表示 this 指向的對(duì)象小于 o 指向的對(duì)象
// == 0: 表示 this 指向的對(duì)象等于 o 指向的對(duì)象
// > 0: 表示 this 指向的對(duì)象等于 o 指向的對(duì)象
int compareTo(E o);
}
2,代碼示例
package java15_20200510;
class Card implements Comparable{
public String rank; //點(diǎn)數(shù)
public String suit; //花色
public Card(String rank, String suit) {
this.rank = rank;
this.suit = suit;
}
@Override
public int compareTo( Card o) {
//如果this比o小,返回一個(gè)小于0的整數(shù)
//如果this比o大,返回一個(gè)大于0的整數(shù)
//如果this == o,返回0
if(o == null){
//一般我們就認(rèn)為this比o大,null比較小
return 1;
}
//點(diǎn)數(shù)取值2-10. JQKA
int rank1 = this.getValue();
int rank2 = o.getValue();
return rank1-rank2;
}
public int getValue(){
//通過(guò)這個(gè)方法把String類型變?yōu)檎麛?shù)點(diǎn)數(shù)
int value = 0;
if("j".equals(rank)){
value = 10;
} else if("Q".equals(rank)){
value = 11;
} else if("k".equals(rank)){
value = 12;
} else if("A".equals(rank)){
value = 14;
} else {
value = Integer.parseInt(rank);
}
return value;
}
}
public class TestCompare {
public static void main(String[] args) {
Card p = new Card("3","?");
Card q = new Card("3","?");
Card o = p;
System.out.println(p.compareTo(null));
System.out.println(p.compareTo(q));
}
}
運(yùn)行結(jié)果:
三, 關(guān)于對(duì)象值大于、等于、小于的比較-基于比較器
1, 認(rèn)識(shí) Comparator
public interface Comparator {
// 返回值:
// < 0: 表示 o1 指向的對(duì)象小于 o2 指向的對(duì)象
// == 0: 表示 o1 指向的對(duì)象等于 o2 指向的對(duì)象
// > 0: 表示 o1 指向的對(duì)象等于 o2 指向的對(duì)象
int compare(T o1, T o2){
//Do
}
}
2,代碼示例
import java.util.Comparator;
class Card {
public String rank; //點(diǎn)數(shù)
public String suit; //花色
public Card(String rank, String suit) {
this.rank = rank;
this.suit = suit;
}
public int getValue(){
//通過(guò)這個(gè)方法把String類型變?yōu)檎麛?shù)點(diǎn)數(shù)
int value = 0;
if("j".equals(rank)){
value = 10;
} else if("Q".equals(rank)){
value = 11;
} else if("k".equals(rank)){
value = 12;
} else if("A".equals(rank)){
value = 14;
} else {
value = Integer.parseInt(rank);
}
return value;
}
}
class CarComparator implements Comparator {
@Override
public int compare(Card o1, Card o2) {
if(o1 == o2){
return 0;
}
if(o1 == null){
return -1;
}
if(o2 == null){
return 1;
}
int result1 = o1.getValue();
int result2 = o2.getValue();
return result1-result2;
}
}
public class TestCompare {
public static void main(String[] args) {
Card p = new Card("3","?");
Card q = new Card("3","?");
Card o = p;
CarComparator comparator = new CarComparator();
System.out.println(comparator.compare(p,q));
System.out.println(comparator.compare(p,null));
System.out.println(comparator.compare(null,q));
}
}
運(yùn)行結(jié)果:
四,比較
五,和 java 集合框架的配合
使用 contains 類似的方法,內(nèi)部基本在調(diào)用元素的 equals 方法,所以要求元素覆寫過(guò) equals 方法
使用 HashMap,key 的比較內(nèi)部會(huì)調(diào)用 equals 方法,所以要求元素覆寫過(guò) equals 方法
使用排序相關(guān)方法,內(nèi)部需要進(jìn)行比較,所以或者選擇實(shí)現(xiàn) Comparable 或者傳入一個(gè) Comparator
使用 TreeMap,key 需要進(jìn)行大小比較,所以或者選擇實(shí)現(xiàn) Comparable 或者傳入一個(gè) Comparator
其他規(guī)則以此類推
六,注意事項(xiàng)
1,使用Comparable接口的時(shí)候,最好指定泛型參數(shù).編譯器自動(dòng)的完成類型校驗(yàn)工作.如果不寫泛型參數(shù),默認(rèn)的compareTo方法的參數(shù)類型就是Object類型.需要程序猿手動(dòng)進(jìn)行類型轉(zhuǎn)換.
2,使用Comparable的時(shí)候,你必須讓要比較的類實(shí)現(xiàn)Comparable接口. (需要修改這個(gè)類的代碼)
3,使用Comparator的時(shí)候,你是重新創(chuàng)建一個(gè)新的類實(shí)現(xiàn)Comparator接口,不需要修改待比較類的代碼
問(wèn)題:為啥有了Comparable還需要有一個(gè)Comparato呢?
1,使用Comparator的時(shí)候必須要修改帶比較類的代碼,實(shí)際開發(fā)中不是所有的類都能修改源碼(這個(gè)類是庫(kù)或者其它組提供的)
2.Comparable只能定義一種比較規(guī)則,Comparator可以定義多種比較規(guī)則
總結(jié)
以上是生活随笔為你收集整理的创建一个水平盒子java_你了解如何比较两个对象吗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基金净值小的好处 还要注意这些方面
- 下一篇: java+jtextfield+取值_[