日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

创建一个水平盒子java_你了解如何比较两个对象吗

發(fā)布時(shí)間:2024/9/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 创建一个水平盒子java_你了解如何比较两个对象吗 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

一,關(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。